Java/File Input Output/StringReader

Материал из Java эксперт
Перейти к: навигация, поиск

Read InputStream to string

   <source lang="java">
 

/*

* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements.  See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License.  You may obtain a copy of the License at
*
*      http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream;

/** Utility class for working with streams.

*/

public final class Streams {

 /**
  * This convenience method allows to read a
  * {@link org.apache.rumons.fileupload.FileItemStream}"s
  * content into a string. The platform"s default character encoding
  * is used for converting bytes into characters.
  * @param pStream The input stream to read.
  * @see #asString(InputStream, String)
  * @return The streams contents, as a string.
  * @throws IOException An I/O error occurred.
  */
 public static String asString(InputStream pStream) throws IOException {
     ByteArrayOutputStream baos = new ByteArrayOutputStream();
     copy(pStream, baos, true);
     return baos.toString();
 }
 /**
  * This convenience method allows to read a
  * {@link org.apache.rumons.fileupload.FileItemStream}"s
  * content into a string, using the given character encoding.
  * @param pStream The input stream to read.
  * @param pEncoding The character encoding, typically "UTF-8".
  * @see #asString(InputStream)
  * @return The streams contents, as a string.
  * @throws IOException An I/O error occurred.
  */
 public static String asString(InputStream pStream, String pEncoding)
         throws IOException {
     ByteArrayOutputStream baos = new ByteArrayOutputStream();
     copy(pStream, baos, true);
     return baos.toString(pEncoding);
 }
   /**
    * Default buffer size for use in
    * {@link #copy(InputStream, OutputStream, boolean)}.
    */
   private static final int DEFAULT_BUFFER_SIZE = 8192;
   /**
    * Copies the contents of the given {@link InputStream}
    * to the given {@link OutputStream}. Shortcut for
*
     *   copy(pInputStream, pOutputStream, new byte[8192]);
     * 
    * @param pInputStream The input stream, which is being read.
    * It is guaranteed, that {@link InputStream#close()} is called
    * on the stream.
    * @param pOutputStream The output stream, to which data should
    * be written. May be null, in which case the input streams
    * contents are simply discarded.
    * @param pClose True guarantees, that {@link OutputStream#close()}
    * is called on the stream. False indicates, that only
    * {@link OutputStream#flush()} should be called finally.
    *
    * @return Number of bytes, which have been copied.
    * @throws IOException An I/O error occurred.
    */
   public static long copy(InputStream pInputStream,
           OutputStream pOutputStream, boolean pClose)
           throws IOException {
       return copy(pInputStream, pOutputStream, pClose,
               new byte[DEFAULT_BUFFER_SIZE]);
   }
   /**
    * Copies the contents of the given {@link InputStream}
    * to the given {@link OutputStream}.
    * @param pIn The input stream, which is being read.
    *   It is guaranteed, that {@link InputStream#close()} is called
    *   on the stream.
    * @param pOut The output stream, to which data should
    *   be written. May be null, in which case the input streams
    *   contents are simply discarded.
    * @param pClose True guarantees, that {@link OutputStream#close()}
    *   is called on the stream. False indicates, that only
    *   {@link OutputStream#flush()} should be called finally.
    * @param pBuffer Temporary buffer, which is to be used for
    *   copying data.
    * @return Number of bytes, which have been copied.
    * @throws IOException An I/O error occurred.
    */
   public static long copy(InputStream pIn,
           OutputStream pOut, boolean pClose,
           byte[] pBuffer)
   throws IOException {
       OutputStream out = pOut;
       InputStream in = pIn;
       try {
           long total = 0;
           for (;;) {
               int res = in.read(pBuffer);
               if (res == -1) {
                   break;
               }
               if (res > 0) {
                   total += res;
                   if (out != null) {
                       out.write(pBuffer, 0, res);
                   }
               }
           }
           if (out != null) {
               if (pClose) {
                   out.close();
               } else {
                   out.flush();
               }
               out = null;
           }
           in.close();
           in = null;
           return total;
       } finally {
           if (in != null) {
               try {
                   in.close();
               } catch (Throwable t) {
                   /* Ignore me */
               }
           }
           if (pClose  &&  out != null) {
               try {
                   out.close();
               } catch (Throwable t) {
                   /* Ignore me */
               }
           }
       }
   }

}


 </source>
   
  
 
  



Reads data off a stream, printing every byte read to System.err

   <source lang="java">
 

/****************************************************************

* Licensed to the Apache Software Foundation (ASF) under one   *
* or more contributor license agreements.  See the NOTICE file *
* distributed with this work for additional information        *
* regarding copyright ownership.  The ASF licenses this file   *
* to you under the Apache License, Version 2.0 (the            *
* "License"); you may not use this file except in compliance   *
* with the License.  You may obtain a copy of the License at   *
*                                                              *
*   http://www.apache.org/licenses/LICENSE-2.0                 *
*                                                              *
* Unless required by applicable law or agreed to in writing,   *
* software distributed under the License is distributed on an  *
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
* KIND, either express or implied.  See the License for the    *
* specific language governing permissions and limitations      *
* under the License.                                           *
****************************************************************/

import java.io.IOException; import java.io.InputStream; /**

* Reads data off a stream, printing every byte read to System.err.
*/

public class DebugInputStream extends InputStream {

   /**
    * The input stream being wrapped
    */
   InputStream in = null;
   /**
    * Constructor that takes an InputStream to be wrapped.
    *
    * @param in the InputStream to be wrapped
    */
   public DebugInputStream(InputStream in) {
       this.in = in;
   }
   /**
    * Read a byte off the stream
    *
    * @return the byte read off the stream
    * @throws IOException if an exception is encountered when reading
    */
   public int read() throws IOException {
       int b = in.read();
       System.err.write(b);
       return b;
   }
   /**
    * Close the stream
    *
    * @throws IOException if an exception is encountered when closing
    */
   public void close() throws IOException {
       in.close();
   }

}


 </source>
   
  
 
  



Reads file contents

   <source lang="java">
 

/**

* 
* The ObjectStyle Group Software License, version 1.1
* ObjectStyle Group - http://objectstyle.org/
* 
* Copyright (c) 2002-2005, Andrei (Andrus) Adamchik and individual authors
* of the software. All rights reserved.
* 
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 
* 1. Redistributions of source code must retain the above copyright
*    notice, this list of conditions and the following disclaimer.
* 
* 2. Redistributions in binary form must reproduce the above copyright
*    notice, this list of conditions and the following disclaimer in
*    the documentation and/or other materials provided with the
*    distribution.
* 
* 3. The end-user documentation included with the redistribution, if any,
*    must include the following acknowlegement:
*    "This product includes software developed by independent contributors
*    and hosted on ObjectStyle Group web site (http://objectstyle.org/)."
*    Alternately, this acknowlegement may appear in the software itself,
*    if and wherever such third-party acknowlegements normally appear.
* 
* 4. The names "ObjectStyle Group" and "Cayenne" must not be used to endorse
*    or promote products derived from this software without prior written
*    permission. For written permission, email
*    "andrus at objectstyle dot org".
* 
* 5. Products derived from this software may not be called "ObjectStyle"
*    or "Cayenne", nor may "ObjectStyle" or "Cayenne" appear in their
*    names without prior written permission.
* 
* THIS SOFTWARE IS PROVIDED ``AS IS"" AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED.  IN NO EVENT SHALL THE OBJECTSTYLE GROUP OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* 
* 
* This software consists of voluntary contributions made by many
* individuals and hosted on ObjectStyle Group web site.  For more
* information on the ObjectStyle Group, please see
* <http://objectstyle.org/>.
*/

import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileReader; import java.io.IOException; import java.io.InputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.OutputStream; import java.io.Serializable; import java.lang.reflect.Member; import java.lang.reflect.Modifier; import java.net.URL; import java.sql.SQLException; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.ruparator; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.regex.Pattern; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.SAXException; import org.xml.sax.XMLReader; /**

* Contains various unorganized static utility methods used across Cayenne.
* 
* @author Andrei Adamchik
*/

public class Util {

   /**
    * Reads file contents, returning it as a String, using System default line separator.
    */
   public static String stringFromFile(File file) throws IOException {
       return stringFromFile(file, System.getProperty("line.separator"));
   }
   /**
    * Reads file contents, returning it as a String, joining lines with provided
    * separator.
    */
   public static String stringFromFile(File file, String joinWith) throws IOException {
       StringBuffer buf = new StringBuffer();
       BufferedReader in = new BufferedReader(new FileReader(file));
       try {
           String line = null;
           while ((line = in.readLine()) != null) {
               buf.append(line).append(joinWith);
           }
       }
       finally {
           in.close();
       }
       return buf.toString();
   }

}


 </source>
   
  
 
  



Reads from an underlying InputStream up to a defined number of bytes or the end of the underlying stream

   <source lang="java">
 

/*

* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements.  See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License.  You may obtain a copy of the License at
*
*      http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

/* $Id: SubInputStream.java 604883 2007-12-17 14:36:37Z jeremias $ */

import java.io.FilterInputStream; import java.io.IOException; import java.io.InputStream; /**

* This class is a FilterInputStream descendant that reads from an underlying InputStream
* up to a defined number of bytes or the end of the underlying stream. Closing this InputStream
* will not result in the underlying InputStream to be closed, too.
*

* This InputStream can be used to read chunks from a larger file of which the length is * known in advance. */ public class SubInputStream extends FilterInputStream { /** Indicates the number of bytes remaining to be read from the underlying InputStream. */ private long bytesToRead; /** * Indicates whether the underlying stream should be closed when the {@link #close()} method * is called. */ private boolean closeUnderlying = false; /** * Creates a new SubInputStream. * @param in the InputStream to read from * @param maxLen the maximum number of bytes to read from the underlying InputStream until * the end-of-file is signalled. * @param closeUnderlying true if the underlying stream should be closed when the * {@link #close()} method is called. */ public SubInputStream(InputStream in, long maxLen, boolean closeUnderlying) { super(in); this.bytesToRead = maxLen; this.closeUnderlying = closeUnderlying; } /** * Creates a new SubInputStream. The underlying stream is not closed, when close() is called. * @param in the InputStream to read from * @param maxLen the maximum number of bytes to read from the underlying InputStream until * the end-of-file is signalled. */ public SubInputStream(InputStream in, long maxLen) { this(in, maxLen, false); } /** {@inheritDoc} */ public int read() throws IOException { if (bytesToRead > 0) { int result = super.read(); if (result >= 0) { bytesToRead--; return result; } else { return -1; } } else { return -1; } } /** {@inheritDoc} */ public int read(byte[] b, int off, int len) throws IOException { if (bytesToRead == 0) { return -1; } int effRead = (int)Math.min(bytesToRead, len); //cast to int is safe because len can never be bigger than Integer.MAX_VALUE int result = super.read(b, off, effRead); if (result >= 0) { bytesToRead -= result; } return result; } /** {@inheritDoc} */ public long skip(long n) throws IOException { long effRead = Math.min(bytesToRead, n); long result = super.skip(effRead); bytesToRead -= result; return result; } /** {@inheritDoc} */ public void close() throws IOException { this.bytesToRead = 0; if (this.closeUnderlying) { super.close(); } } } ////////////////////////////////// /* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* $Id: SubInputStreamTestCase.java 604883 2007-12-17 14:36:37Z jeremias $ */ package org.apache.xmlgraphics.util.io; import java.io.ByteArrayInputStream; import java.util.Arrays; import junit.framework.TestCase; /** * Test case for SubInputStream. */ public class SubInputStreamTestCase extends TestCase { /** * Main constructor. * @param name the test case"s name * @see junit.framework.TestCase#TestCase(String) */ public SubInputStreamTestCase(String name) { super(name); } /** * Tests SubInputStream. * @throws Exception if an error occurs */ public void testMain() throws Exception { //Initialize test data byte[] data = new byte[256]; for (int i = 0; i < data.length; i++) { data[i] = (byte)(i & 0xff); } int v, c; byte[] buf; String s; SubInputStream subin = new SubInputStream(new ByteArrayInputStream(data), 10); v = subin.read(); assertEquals(0, v); v = subin.read(); assertEquals(1, v); buf = new byte[4]; c = subin.read(buf); assertEquals(4, c); s = new String(buf, "US-ASCII"); assertEquals("\u0002\u0003\u0004\u0005", s); Arrays.fill(buf, (byte)0); c = subin.read(buf, 2, 2); assertEquals(2, c); s = new String(buf, "US-ASCII"); assertEquals("\u0000\u0000\u0006\u0007", s); Arrays.fill(buf, (byte)0); c = subin.read(buf); assertEquals(2, c); s = new String(buf, "US-ASCII"); assertEquals("\u0008\u0009\u0000\u0000", s); } } </source>

Read string from InputStream and Reader

   <source lang="java">
 

/*

* $RCSfile: StringIO.java,v $
*
* Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistribution of source code must retain the above copyright
*   notice, this list of conditions and the following disclaimer.
*
* - Redistribution in binary form must reproduce the above copyright
*   notice, this list of conditions and the following disclaimer in
*   the documentation and/or other materials provided with the
*   distribution.
*
* Neither the name of Sun Microsystems, Inc. or the names of
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* This software is provided "AS IS," without a warranty of any
* kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
* WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
* EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
* NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
* USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
* ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
* CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
* REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
* INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES.
*
* You acknowledge that this software is not designed, licensed or
* intended for use in the design, construction, operation or
* maintenance of any nuclear facility.
*
* $Revision: 1.4 $
* $Date: 2007/02/09 17:20:42 $
* $State: Exp $
*/

import java.io.IOException; import java.io.File; import java.io.FileReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.net.URL; /**

* Utility class with static methods to read the entire contents of a
* file, URL, InputStream, or Reader into a single String that is
* returned to the user.
*
* @since Java 3D 1.4
*/

public class StringIO {

   /**
    * Read the entire contents of the specified file and return a
    * single String object containing the contents of the file.
    *
    * @param fileName the name of the file from which to read
    *
    * @return a String containing the contents of the input file
    *
    * @throws IOException if the specified file cannot be opened, or
    * if an I/O error occurs while reading the file
    */
   public static String readFully(String fileName) throws IOException {
 return readFully(new File(fileName));
   }
   /**
    * Read the entire contents of the specified file and return a
    * single String object containing the contents of the file.
    * This method does not return until the end of the input file
    * is reached.
    *
    * @param file a File from which to read
    *
    * @return a String containing the contents of the input file
    *
    * @throws IOException if the specified file cannot be opened, or
    * if an I/O error occurs while reading the file
    */
   public static String readFully(File file) throws IOException {
 return readFully(new FileReader(file));
   }
   /**
    * Read the entire contents of the specified URL and return a
    * single String object containing the contents of the URL.
    * This method does not return until an end of stream is reached
    * for the URL.
    *
    * @param url a URL from which to read
    *
    * @return a String containing the contents of the input URL
    *
    * @throws IOException if the specified URL cannot be opened, or
    * if an I/O error occurs while reading the URL
    */
   public static String readFully(URL url) throws IOException {
 return readFully(url.openStream());
   }
   /**
    * Read the entire contents of the specified InputStream and return a
    * single String object containing the contents of the InputStream.
    * This method does not return until the end of the input
    * stream is reached.
    *
    * @param stream an InputStream from which to read
    *
    * @return a String containing the contents of the input stream
    *
    * @throws IOException if an I/O error occurs while reading the input stream
    */
   public static String readFully(InputStream stream) throws IOException {
 return readFully(new InputStreamReader(stream));
   }
   /**
    * Read the entire contents of the specified Reader and return a
    * single String object containing the contents of the InputStream.
    * This method does not return until the end of the input file or
    * stream is reached.
    *
    * @param reader a Reader from which to read
    *
    * @return a String containing the contents of the stream
    *
    * @throws IOException if an I/O error occurs while reading the input stream
    */
   public static String readFully(Reader reader) throws IOException {
 char[] arr = new char[8*1024]; // 8K at a time
 StringBuffer buf = new StringBuffer();
 int numChars;
 while ((numChars = reader.read(arr, 0, arr.length)) > 0) {
     buf.append(arr, 0, numChars);
 }
 return buf.toString();
   }
   /**
    * Do not construct an instance of this class.
    */
   private StringIO() {
   }

}


 </source>
   
  
 
  



Using the StringReader class

   <source lang="java">
 

import java.io.StreamTokenizer; import java.io.StringReader; public class Main {

 public static void main(String[] args) throws Exception{
   StringReader reader = new StringReader("this is a test");
   int wordCount = 0;
   StreamTokenizer streamTokenizer = new StreamTokenizer(reader);
   while (streamTokenizer.nextToken() != StreamTokenizer.TT_EOF) {
     if (streamTokenizer.ttype == StreamTokenizer.TT_WORD)
       wordCount++;
   }
   System.out.println("Number of words in file: " + wordCount);
 }

} //Number of words in file: 4


 </source>