Java:将控制台输出写入文件,不工作

时间:2015-11-30 16:52:37

标签: java

我已经编写了一个端口扫描应用程序,我想将我的控制台输出写入文件,但是发生了一个小问题。 “PrintStream”没有将所有控制台输出写入文件。
例如:try块中显示控制台中已打开端口的代码不会向文件写入任何内容,而是{{1块写的。

我的代码:

catch

2 个答案:

答案 0 :(得分:0)

您有一些与手头问题直接相关的问题。

  1. 您在启动线程后设置输出,因此输出的位置几乎是随机的。
  2. 你不要等待线程完成,所以应用程序"刚刚结束"在随机点。
  3. 您不要刷新输出。
  4. 更新的代码:

    class StartPortTester {
        public static void main(String[] args) throws IOException, InterruptedException {
    
            // Set up the stream BEFORE starting threads
            // This should be in a try-with-resources, or the close done in a finally block.
            PrintStream printStream = new PrintStream(new FileOutputStream("ports.txt"));
            System.setOut(printStream);
    
            // Start the threads!    
            List<PortTester> testers = new LinkedList<>();
            for (int i = 5935; i < 10000; i++){
                testers.add(new PortTester(i));
            }
    
            // Wait for the threads to end
            for(PortTester t : testers ) {
                t.y.join();
            }
    
            // Flush (write to disk) and close.
            printStream.flush();
            printStream.close();;
        }
    }
    
    
    class PortTester implements Runnable{
    
        static String host = "localhost";
        int t;
        Thread y;
    
        public PortTester(int t2){
            t = t2;
            y = new Thread(this);
            y.start();
        }
    
        public void run() {
            try {
                // You should close this either in the finally block or using a try-with-resource. 
                Socket socket = new Socket(host, t);
                System.out.println("Port is alive - " + t);
            } catch (IOException e){
                System.out.println("Port is dead... - " + t);
            }
    
        }
    }
    

    这不是完美的

    • 它创建了大量的线程,并且使用线程池会更好。
    • 它也会永远等待线程完成,你可能希望它在放弃之前只等待 x 秒。
    • 例外会导致文件无法刷新&amp;关闭。
    • 您将演示与逻辑混淆。我不在PortTester中编写System.out,而是创建一个描述端口状态的数据结构,然后输出(从逻辑单独表示)。
    • 目前输出的排序是随机的(基于线程完成的时间)。

答案 1 :(得分:0)

  • 关闭套接字
  • 使用Executor服务
  • 在写入输出之前设置输出流
  • 等待所有工作准备就绪
  • 准备就绪时冲洗输出
  • 关闭printStream

结果:

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class start
{

  public static void main(String[] args) throws Exception {

    try (PrintStream printStream = new PrintStream(new FileOutputStream("E:\\ports.txt"))) {
        System.setOut(printStream);

        ExecutorService pool = Executors.newCachedThreadPool();
        for (int i = 5935; i < 10000; i++) {
            final int port = i;
            pool.execute(() -> {
                try (Socket socket = new Socket("localhost", port)) {
                    System.out.println("Port is alive - " + port);
                }
                catch (IOException e) {
                    System.out.println("Port is dead... - " + port);
                }
            });
        }
        pool.awaitTermination(100, TimeUnit.SECONDS);
        printStream.flush();
    }
  }
}