Java/File Input Output/PipedReader

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

Create PipedReader out of PipedWriter

   <source lang="java">

/*

* Copyright (c) 1995 - 2008 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:
*
*   - Redistributions of source code must retain the above copyright
*     notice, this list of conditions and the following disclaimer.
*
*   - 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.
*
*   - Neither the name of Sun Microsystems nor the names of its
*     contributors may be used to endorse or promote products derived
*     from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
* IS" AND ANY EXPRESS 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 COPYRIGHT OWNER OR
* 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.
*/

import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.io.PipedReader; import java.io.PipedWriter; import java.io.PrintWriter; import java.io.Reader; public class RhymingWords {

 public static void main(String[] args) throws IOException {
   FileReader words = new FileReader("words.txt");
   // do the reversing and sorting
   Reader rhymedWords = reverse(sort(reverse(words)));
   // write new list to standard out
   BufferedReader in = new BufferedReader(rhymedWords);
   String input;
   while ((input = in.readLine()) != null)
     System.out.println(input);
   in.close();
 }
 public static Reader reverse(Reader source) throws IOException {
   BufferedReader in = new BufferedReader(source);
   PipedWriter pipeOut = new PipedWriter();
   PipedReader pipeIn = new PipedReader(pipeOut);
   PrintWriter out = new PrintWriter(pipeOut);
   new ReverseThread(out, in).start();
   return pipeIn;
 }
 public static Reader sort(Reader source) throws IOException {
   BufferedReader in = new BufferedReader(source);
   PipedWriter pipeOut = new PipedWriter();
   PipedReader pipeIn = new PipedReader(pipeOut);
   PrintWriter out = new PrintWriter(pipeOut);
   new SortThread(out, in).start();
   return pipeIn;
 }

} /*

* Copyright (c) 1995 - 2008 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:
*  - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*  - 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.
*  - Neither the name of Sun Microsystems nor the names of its contributors may
* be used to endorse or promote products derived from this software without
* specific prior written permission.
* 
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS 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 COPYRIGHT OWNER OR 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.
*/

class SortThread extends Thread {

 private PrintWriter out = null;
 private BufferedReader in = null;
 public SortThread(PrintWriter out, BufferedReader in) {
   this.out = out;
   this.in = in;
 }
 public void run() {
   int MAXWORDS = 50;
   if (out != null && in != null) {
     try {
       String[] listOfWords = new String[MAXWORDS];
       int numwords = 0;
       while ((listOfWords[numwords] = in.readLine()) != null)
         numwords++;
       quicksort(listOfWords, 0, numwords - 1);
       for (int i = 0; i < numwords; i++)
         out.println(listOfWords[i]);
       out.close();
     } catch (IOException e) {
       System.err.println("SortThread run: " + e);
     }
   }
 }
 private static void quicksort(String[] a, int lo0, int hi0) {
   int lo = lo0;
   int hi = hi0;
   if (lo >= hi)
     return;
   String mid = a[(lo + hi) / 2];
   while (lo < hi) {
     while (lo < hi && a[lo].rupareTo(mid) < 0)
       lo++;
     while (lo < hi && a[hi].rupareTo(mid) > 0)
       hi--;
     if (lo < hi) {
       String T = a[lo];
       a[lo] = a[hi];
       a[hi] = T;
       lo++;
       hi--;
     }
   }
   if (hi < lo) {
     int T = hi;
     hi = lo;
     lo = T;
   }
   quicksort(a, lo0, lo);
   quicksort(a, lo == lo0 ? lo + 1 : lo, hi0);
 }

} /*

* Copyright (c) 1995 - 2008 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:
*  - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*  - 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.
*  - Neither the name of Sun Microsystems nor the names of its contributors may
* be used to endorse or promote products derived from this software without
* specific prior written permission.
* 
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS 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 COPYRIGHT OWNER OR 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.
*/

class ReverseThread extends Thread {

 private PrintWriter out = null;
 private BufferedReader in = null;
 public ReverseThread(PrintWriter out, BufferedReader in) {
   this.out = out;
   this.in = in;
 }
 public void run() {
   if (out != null && in != null) {
     try {
       String input;
       while ((input = in.readLine()) != null) {
         out.println(reverseIt(input));
         out.flush();
       }
       out.close();
     } catch (IOException e) {
       System.err.println("ReverseThread run: " + e);
     }
   }
 }
 private String reverseIt(String source) {
   int i, len = source.length();
   StringBuffer dest = new StringBuffer(len);
   for (i = (len - 1); i >= 0; i--)
     dest.append(source.charAt(i));
   return dest.toString();
 }

}

</source>