📄 fileutils.java
字号:
/*
* (c) Copyright 2002, 2003, 2004, 2005, 2006, 2007 Hewlett-Packard Development Company, LP
* [See end of file]
*/
package com.hp.hpl.jena.util;
import java.io.*;
import java.net.URL;
import java.nio.charset.Charset ;
import org.apache.commons.logging.LogFactory;
import com.hp.hpl.jena.n3.RelURI;
import com.hp.hpl.jena.shared.JenaException;
import com.hp.hpl.jena.shared.WrappedIOException;
import com.hp.hpl.jena.JenaRuntime ;
public class FileUtils
{
public static final String langXML = "RDF/XML" ;
public static final String langXMLAbbrev = "RDF/XML-ABBREV" ;
public static final String langNTriple = "N-TRIPLE" ;
public static final String langN3 = "N3" ;
public static final String langTurtle = "TURTLE" ;
// Non-standard
public static final String langBDB = "RDF/BDB" ;
public static final String langSQL = "RDF/SQL" ;
/** Java name for UTF-8 encoding */
public static final String encodingUTF8 = "utf-8" ;
static Charset utf8 = null ;
static {
try {
utf8 = Charset.forName(encodingUTF8) ;
} catch (Throwable ex)
{
LogFactory.getLog(FileUtils.class).warn("Failed to get charset for UTF-8") ;
}
}
/** Create a reader that uses UTF-8 encoding */
static public Reader asUTF8(InputStream in) {
if ( JenaRuntime.runUnder(JenaRuntime.featureNoCharset) )
return new InputStreamReader(in) ;
// Not ,utf8 -- GNUClassPath (0.20) apparently fails on passing in a charset
// but if passed not the decoder or the name of the charset.
// Reported and fixed.
return new InputStreamReader(in, utf8.newDecoder());
}
/** Create a buffered reader that uses UTF-8 encoding */
static public BufferedReader asBufferedUTF8(InputStream in) {
return new BufferedReader(asUTF8(in)) ;
}
/** Create a writer that uses UTF-8 encoding */
static public Writer asUTF8(OutputStream out) {
if ( JenaRuntime.runUnder(JenaRuntime.featureNoCharset) )
return new OutputStreamWriter(out) ;
return new OutputStreamWriter(out, utf8.newEncoder());
}
/** Create a print writer that uses UTF-8 encoding */
static public PrintWriter asPrintWriterUTF8(OutputStream out) {
return new PrintWriter(asUTF8(out));
}
/** Guess the language/type of model data. Updated by Chris, hived off the
* model-suffix part to FileUtils as part of unifying it with similar code in FileGraph.
*
* <ul>
* <li> If the URI of the model starts jdbc: it is assumed to be an RDB model</li>
* <li> If the URI ends ".rdf", it is assumed to be RDF/XML</li>
* <li> If the URI end .nt, it is assumed to be N-Triples</li>
* <li> If the URI end .bdb, it is assumed to be BerkeleyDB model [suppressed at present]</li>
* </ul>
* @param name URL to base the guess on
* @param otherwise Default guess
* @return String Guessed syntax - or the default supplied
*/
public static String guessLang( String name, String otherwise )
{
if ( name.startsWith("jdbc:") || name.startsWith("JDBC:") )
return langSQL ;
String suffix = getFilenameExt( name );
if (suffix.equals( "n3" )) return langN3;
if (suffix.equals( "nt" )) return langNTriple;
if (suffix.equals( "ttl" )) return langTurtle ;
if (suffix.equals( "rdf" )) return langXML;
if (suffix.equals( "owl" )) return langXML;
return otherwise;
}
/** Guess the language/type of model data
*
* <ul>
* <li> If the URI of the model starts jdbc: it is assumed to be an RDB model</li>
* <li> If the URI ends .rdf, it is assumed to be RDF/XML</li>
* <li> If the URI ends .n3, it is assumed to be N3</li>
* <li> If the URI ends .nt, it is assumed to be N-Triples</li>
* <li> If the URI ends .bdb, it is assumed to be BerkeleyDB model</li>
* </ul>
* @param urlStr URL to base the guess on
* @return String Guessed syntax - default is RDF/XML
*/
public static String guessLang(String urlStr)
{
return guessLang(urlStr, langXML) ;
}
/** Turn a file: URL or file name into a plain file name */
public static String toFilename(String filenameOrURI)
{
// Requirements of windows and Linux differ slightly here
// Windows wants "file:///c:/foo" => "c:/foo"
// but Linux only wants "file:///foo" => "/foo"
// Pragmatically, a path of "/c:/foo", or "/foo" works everywhere.
// but not "//c:/foo" or "///c:/foo"
// else IKVM thinks its a network path on Windows.
// If it's a a file: we apply %-decoding.
// If there is no scheme name, we don't.
if ( !isFile(filenameOrURI) )
return null ;
// No scheme of file:
String fn = filenameOrURI ;
if ( ! fn.startsWith("file:") )
return fn ;
// file:
// Convert absolute file names
if ( fn.startsWith("file:///") )
fn = fn.substring("file://".length()) ;
else if ( fn.startsWith("file://localhost/") )
// NB Leaves the leading slash on.
fn = fn.substring("file://localhost".length()) ;
else
// Just trim off the file:
fn = fn.substring("file:".length()) ;
return decodeFileName(fn) ;
}
public static String decodeFileName(String s)
{
if ( s.indexOf('%') < 0 )
return s ;
int len = s.length();
StringBuffer sbuff = new StringBuffer(len) ;
// This is URIRef.decode()? Is that code used?
// Just decode % escapes.
// Not http://www.daml.org/2001/03/daml+oil
for ( int i =0 ; i < len ; i++ )
{
char c = s.charAt(i);
switch (c)
{
case '%':
int codepoint = Integer.parseInt(s.substring(i+1,i+3),16) ;
char ch = (char)codepoint ;
sbuff.append(ch) ;
i = i+2 ;
break ;
default:
sbuff.append(c);
}
}
return sbuff.toString();
}
/** Turn a plain filename into a "file:" URL */
public static String toURL(String filename)
{
if ( filename.startsWith("file:") )
return filename ;
filename = encodeFileName(filename) ;
return RelURI.resolveFileURL(filename) ;
}
public static String encodeFileName(String s)
{
int len = s.length();
StringBuffer sbuff = new StringBuffer(len) ;
// Convert a few charcaters that occur in filenames into a safe form.
for ( int i = 0 ; i < len ; i++ )
{
char c = s.charAt(i);
switch (c)
{
case ' ': case '~':
sbuff.append('%') ;
sbuff.append(Integer.toHexString(c).toUpperCase()) ;
break ;
default:
sbuff.append(c);
}
}
return sbuff.toString();
}
/** Check whether 'name' is possibly a file reference
*
* @param name
* @return boolean False if clearly not a filename.
*/
public static boolean isFile(String name)
{
String scheme = getScheme(name) ;
if ( scheme == null )
// No URI scheme - treat as filename
return true ;
if ( scheme.equals("file") )
// file: URI scheme
return true ;
// Windows: "c:" etc
if ( scheme.length() == 1 )
// file: URI scheme
return true ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -