📄 utils.java
字号:
} } else if ( o instanceof short[] ) { short[] sa = (short[]) o; for ( int i = 0; i < sa.length; ++i ) { if ( i > 0 ) sb.append( ", " ); sb.append( "(short)" ); sb.append( sa[i] ); } } else if ( o instanceof int[] ) { int[] ia = (int[]) o; for ( int i = 0; i < ia.length; ++i ) { if ( i > 0 ) sb.append( ", " ); sb.append( ia[i] ); } } else if ( o instanceof long[] ) { long[] la = (long[]) o; for ( int i = 0; i < la.length; ++i ) { if ( i > 0 ) sb.append( ", " ); sb.append( la[i] ); sb.append( "L" ); } } else if ( o instanceof float[] ) { float[] fa = (float[]) o; for ( int i = 0; i < fa.length; ++i ) { if ( i > 0 ) sb.append( ", " ); sb.append( fa[i] ); sb.append( "F" ); } } else if ( o instanceof double[] ) { double[] da = (double[]) o; for ( int i = 0; i < da.length; ++i ) { if ( i > 0 ) sb.append( ", " ); sb.append( da[i] ); sb.append( "D" ); } } else if ( o instanceof String ) { // Special-case Strings so we can surround them with quotes. String[] sa = (String[]) o; for ( int i = 0; i < sa.length; ++i ) { if ( i > 0 ) sb.append( ", " ); sb.append( "\"" ); sb.append( sa[i] ); sb.append( "\"" ); } } else if ( cl.startsWith( "[L" ) ) { // Some random class. Object[] oa = (Object[]) o; for ( int i = 0; i < oa.length; ++i ) { if ( i > 0 ) sb.append( ", " ); sb.append( oa[i] ); } } else if ( cl.startsWith( "[[" ) ) { // Nested arrays. Object[] aa = (Object[]) o; for ( int i = 0; i < aa.length; ++i ) { if ( i > 0 ) sb.append( ", " ); sb.append( arrayToString( aa[i] ) ); } } else sb.append( "(unknown array type)" ); sb.append( " }" ); return sb.toString(); } /// Check if an object extends a given class or one of its superclasses. // An instanceof that works on Class objects at runtime, instead // of type descriptors at compile time. public static boolean instanceOf( Object o, Class cl ) { // Null check. if ( o == null || cl == null ) return false; Class ocl = o.getClass(); // Check if they are the same class. if ( ocl.equals( cl ) ) return true; // If the class is not itself an interface, then check its interfaces. if ( ! cl.isInterface() ) { Class ifs[] = cl.getInterfaces(); for ( int i = 0; i < ifs.length; ++i ) if ( instanceOf( o, ifs[i] ) ) return true; } // And check supeclasses. Class scl = cl.getSuperclass(); if ( scl != null ) if ( instanceOf( o, scl ) ) return true; // Guess not. return false; } /// Test is a number is even. public static boolean even( long n ) { return ( n & 1 ) == 0; } /// Test is a number is odd. public static boolean odd( long n ) { return ( n & 1 ) != 0; } /// Count the number of 1-bits in a byte. public static int countOnes( byte n ) { return countOnes( n & 0xffL ); } /// Count the number of 1-bits in an int. public static int countOnes( int n ) { return countOnes( n & 0xffffffffL ); } /// Count the number of 1-bits in a long. public static int countOnes( long n ) { // There are faster ways to do this, all the way up to looking // up bytes in a 256-element table. But this is not too bad. int count = 0; while ( n != 0 ) { if ( odd( n ) ) ++count; n >>>= 1; } return count; } /// A fixed version of java.io.InputStream.read(byte[], int, int). The // standard version catches and ignores IOExceptions from below. // This version sends them on to the caller. public static int read( InputStream in, byte[] b, int off, int len ) throws IOException { if ( len <= 0 ) return 0; int c = in.read(); if ( c == -1 ) return -1; if ( b != null ) b[off] = (byte) c; int i; for ( i = 1; i < len ; ++i ) { c = in.read(); if ( c == -1 ) break; if ( b != null ) b[off + i] = (byte) c; } return i; } /// A version of read that reads the entire requested block, instead // of sometimes terminating early. // @return -1 on EOF, otherwise len public static int readFully( InputStream in, byte[] b, int off, int len ) throws IOException { int l, r; for ( l = 0; l < len; ) { r = read( in, b, l, len - l ); if ( r == -1 ) return -1; l += r; } return len; } /// Make a URL with no ref part and no query string. Also, if it's // a directory then make sure there's a trailing slash. public static URL plainUrl( URL context, String urlStr ) throws MalformedURLException { URL url = new URL( context, urlStr ); String fileStr = url.getFile(); int i = fileStr.indexOf( '?' ); if ( i != -1 ) fileStr = fileStr.substring( 0, i ); url = new URL( url.getProtocol(), url.getHost(), url.getPort(), fileStr ); if ( ( ! fileStr.endsWith( "/" ) ) && urlStrIsDir( url.toExternalForm() ) ) { fileStr = fileStr + "/"; url = new URL( url.getProtocol(), url.getHost(), url.getPort(), fileStr ); } return url; } /// Make a URL with no ref part and no query string. Also, if it's // a directory then make sure there's a trailing slash. public static URL plainUrl( String urlStr ) throws MalformedURLException { return plainUrl( null, urlStr ); } /// Figure out the base URL for a given URL. What this means is // if the URL points to a directory, you get that directory; if the // URL points to a file, you get the directory the file is in. public static String baseUrlStr( String urlStr ) { if ( urlStr.endsWith( "/" ) ) return urlStr; if ( urlStrIsDir( urlStr ) ) return urlStr + "/"; return urlStr.substring( 0, urlStr.lastIndexOf( '/' ) + 1 ); } /// Makes sure if a URL is a directory, it ends with a slash. public static String fixDirUrlStr( String urlStr ) { if ( urlStr.endsWith( "/" ) ) return urlStr; if ( urlStrIsDir( urlStr ) ) return urlStr + "/"; return urlStr; } /// Figures out whether a URL points to a directory or not. // Web servers are lenient and accept directory-URLs without // the trailing slash. What they actually do is return a // redirect to the same URL with the trailing slash appended. // Unfortunately, Java doesn't let us see that such a redirect // happened. Instead we have to figure out it's a directory // indirectly and heuristically. public static boolean urlStrIsDir( String urlStr ) { // If it ends with a slash, it's probably a directory. if ( urlStr.endsWith( "/" ) ) return true; // If the last component has a dot, it's probably not a directory. int lastSlash = urlStr.lastIndexOf( '/' ); int lastPeriod = urlStr.lastIndexOf( '.' ); if ( lastPeriod != -1 && ( lastSlash == -1 || lastPeriod > lastSlash ) ) return false; // Otherwise, append a slash and try to connect. This is // fairly expensive. String urlStrWithSlash = urlStr + "/"; try { URL url = new URL( urlStrWithSlash ); InputStream f = url.openStream(); f.close(); // Worked fine - it's probably a directory. return true; } catch ( Exception e ) { // Got an error - must not be a directory. return false; } } // Figures out whether a URL is absolute or not. public static boolean urlStrIsAbsolute( String urlStr ) { if ( urlStr.startsWith( "/" ) || urlStr.indexOf( ":/" ) != -1 ) return true; // Should handle :8000/ and such too. return false; } // Returns an equivalent URL string that is guaranteed to be absolute. public static String absoluteUrlStr( String urlStr, URL contextUrl ) throws MalformedURLException { URL url = new URL( contextUrl, urlStr ); return url.toExternalForm(); } /// URLDecoder to go along with java.net.URLEncoder. Why there isn't // already a decoder in the standard library is a mystery to me. public static String urlDecoder( String encoded ) { StringBuffer decoded = new StringBuffer(); int len = encoded.length(); for ( int i = 0; i < len; ++i ) { if ( encoded.charAt( i ) == '%' && i + 2 < len ) { int d1 = Character.digit( encoded.charAt( i + 1 ), 16 ); int d2 = Character.digit( encoded.charAt( i + 2 ), 16 ); if ( d1 != -1 && d2 != -1 ) decoded.append( (char) ( ( d1 << 4 ) + d2 ) ); i += 2; } else if ( encoded.charAt( i ) == '+' ) decoded.append( ' ' ); else decoded.append( encoded.charAt( i ) ); } return decoded.toString(); } /// Check if an array contains a given element. public static boolean arraycontains( Object[] array, Object element ) { for ( int i = 0; i < array.length; ++i ) if ( array[i].equals( element ) ) return true; return false; } /// Run a program on the host system. // <P> // This routine runs the specified command, waits for it to // finish, and returns the exit status. // This is like the Unix system() routine. Unlike the Unix version, // though, stdout and stderr get thrown away unless you redirect them. public static int system( String cmd ) { try { return runCommand( cmd ).waitFor(); } catch ( IOException e ) { return -1; } catch ( InterruptedException e ) { return -1; } } /// Run a program on the host system, and capture the output. // <P> // This routine runs the specified command, and returns an InputStream // for reading the output of the program. // <P> // <B>WARNING:</B> In JDK1.0.2 there is a serious bug in the process // IO routines, such that reading all the way to the end of a process's // output will invariably get you an IOException( "read error" ). // In some cases you will also <B>lose</B> the last bufferload of // the output. The workaround is to add a " ; sleep 1" to the end of // your command, and to ignore the "read error" IOException. public static InputStream popenr( String cmd ) { try { return runCommand( cmd ).getInputStream(); } catch ( IOException e ) { return null; } } /// Run a program on the host system, and send it some input. // <P> // This routine runs the specified command, and returns an OutputStream // for writing the program's input. public static OutputStream popenw( String cmd ) { try { return runCommand( cmd ).getOutputStream(); } catch ( IOException e ) { return null; } } /// Run a program on the host system. // <P> // This routine runs the specified command, and returns a Process // object so you can do what you like with it. // <P> // <B>WARNING:</B> In JDK1.0.2 there is a serious bug in the process // IO routines, such that reading all the way to the end of a process's // output will invariably get you an IOException( "read error" ). // In some cases you will also <B>lose</B> the last bufferload of // the output. The workaround is to add a " ; sleep 1" to the end of // your command, and to ignore the "read error" IOException. public static Process runCommand( String cmd ) throws IOException { Runtime runtime = Runtime.getRuntime(); String[] shCmd = new String[3]; shCmd[0] = "/bin/sh"; shCmd[1] = "-c"; shCmd[2] = cmd; return runtime.exec( shCmd ); } /// Copy the input to the output until EOF. public static void copyStream( InputStream in, OutputStream out ) throws IOException { byte[] buf = new byte[4096]; int len; while ( ( len = in.read( buf ) ) != -1 ) out.write( buf, 0, len ); } /// Copy the input to the output until EOF. public static void copyStream( Reader in, Writer out ) throws IOException { char[] buf = new char[4096]; int len; while ( ( len = in.read( buf ) ) != -1 ) out.write( buf, 0, len ); } /// Copy the input to the output until EOF. public static void copyStream( InputStream in, Writer out ) throws IOException { byte[] buf1 = new byte[4096]; char[] buf2 = new char[4096]; int len, i; while ( ( len = in.read( buf1 ) ) != -1 ) { for ( i = 0; i < len; ++i ) buf2[i] = (char) buf1[i]; out.write( buf2, 0, len ); } } /// Copy the input to the output until EOF. public static void copyStream( Reader in, OutputStream out ) throws IOException { char[] buf1 = new char[4096]; byte[] buf2 = new byte[4096]; int len, i; while ( ( len = in.read( buf1 ) ) != -1 ) { for ( i = 0; i < len; ++i ) buf2[i] = (byte) buf1[i]; out.write( buf2, 0, len ); } } /// Dump out the current call stack. public static void dumpStack( PrintStream p ) { (new Throwable()).printStackTrace( p ); } /// Dump out the current call stack onto System.err. public static void dumpStack() { (new Throwable()).printStackTrace(); } /// add a hash table to a hash table public static void putAll(Hashtable _dest, Hashtable _src) { } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -