java - 使用 java 线程间在控制台中进行文件传输

标签 java multithreading concurrency

我有 2 个线程可以在控制台中相互通信(就像彼此之间聊天一样)。线程只能发送消息,消息是用户输入的。 我想在这两个线程之间发送文件(例如:.pdf)。怎么做?

在下面的代码中您将发现两个线程通信。

    import java.util.Scanner;

    public class Conversation {
        public static void main(String[] args) {

            Chat chat = new Chat();

           new Thread1(chat).start();
            new Thread2(chat).start();
        }
    }



    class Chat {
        Scanner sc1 = new Scanner(System.in);
        Scanner sc2 = new Scanner(System.in);
        String str1,str2;
        int flag = 2;

        public synchronized void getTalk1() throws InterruptedException {
        if (flag==1) {
            wait();
        }
        System.out.print("User1: ");
        str1 = sc1.nextLine();
        if(str1.equalsIgnoreCase("bye")) {
            System.out.println("\nUser1 has left the chat. Conversation ended.");
            System.exit(0);
        }
        flag = 1;
        notify();
    }

        public synchronized void getTalk2() throws InterruptedException {
        if (flag == 2) {
            wait();
        }
        System.out.print("User2: ");
        str2 = sc2.nextLine();
        if(str2.equalsIgnoreCase("bye")) {
            System.out.println("\nUser2 has left the chat. Conversation ended.");
            System.exit(0);
        }
        flag = 2;
        notify();
        }
    }

    //Thread-1 class
    class Thread1 extends Thread {
    Chat chat;

    public Thread1(Chat chat) {
        this.chat = chat;
    }


    public void run() {
        try {
            while(true) {
                chat.getTalk1();
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        }
    }

    //Thread-2 class
    class Thread2 extends Thread {
    Chat chat;


    public Thread2(Chat chat) {
        this.chat = chat;
    }


    public void run() {
        try {
            while(true) {
                chat.getTalk2();
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        }
    }


这是 2 线程通信的输出:2 threads communication

最佳答案

如果我正确理解这个问题:

  • 您有一个线程写入控制台,另一个线程从控制台读取
  • 您正在使用它进行线程间通信?!!
  • 您想要通过线程间通信发送 pdf 的内容。

这根本不是在线程之间共享信息的好方法。除了教育目的之外,你永远不应该真正这样做。如果你想让两个线程访问一个pdf,你应该有一个变量,要么是一个字节数组(如果你想共享pdf文件的内容),要么是一个路径(如果你想共享pdf的位置) 。确保适本地同步对这些变量的访问。

回答原来的问题: 只需使用现有代码并将纯文本文件作为字符串读取,就可以轻松共享这样的纯文本文件的内容。如果您只想共享 pdf 文件的位置,您还可以以字符串形式发送和接收该位置。如果您想共享 pdf 文件的内容,这会变得更加棘手,因为控制台对特殊字符的解释不同。例如,某些控制台可能具有用于清除屏幕、更改输出颜色甚至更改字体的特殊字符。 pdf 文件的内容可能包含其中一些特殊字符。因此,您不能只将内容作为字节数组发送,然后从控制台读取字节数组。当前处理此类问题的标准方法是使用 Base64 Encoding 。这使您可以避免在通过控制台发送的内容中出现任何特殊字符。用于 base64 编码的标准 Java API 可以在 java.lang.Base64.Encoder 中找到。 。总而言之,如果您想通过控制台发送 pdf 的内容,您首先需要将 pdf 作为字节数组获取,将该字节数组转换为 base64,将 base64 作为字符串打印出来,在另一个线程中读取该字符串然后将 base64 字符串转换回字节数组。只是提醒您应该使用变量进行这种线程间通信,而不是如上所述的控制台。

关于java - 使用 java 线程间在控制台中进行文件传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57635499/

相关文章:

java - 使用 3 个类将中缀转换为后缀(无缓冲区读取器)

java - 重写(Override)equals和hashCode方法时应考虑的问题

java - 我应该为此动画使用 SwingWorker、线程或递归更新吗?

java - 限制对数据库操作的并发 Web 服务调用

java - 在 Java 中构建 SQL 字符串的最简洁方法

java - Android 初学者 : Ads at the Bottom of the XML

c# - linq-to-sql用户并发

java - 迭代器中的 .next 引发的并发修改异常

java - JPA 多线程 org.eclipse.persistence.exceptions.ConcurrencyException

c# - InvalidOperationException:集合已修改;指的是哪个集合?