在JAVA中我得到两个文件流,一个是本地的,一个是服务器上的,怎么将本地的流写入到服务器的流中

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在JAVA中我得到两个文件流,一个是本地的,一个是服务器上的,怎么将本地的流写入到服务器的流中相关的知识,希望对你有一定的参考价值。

服务器的流是通过HttpURLConnection转换URL得到的,就想实现一个在线编辑的功能,把更改的文件流写到服务器上的原文件中

你写个接口就行。不过还是要放在服务器上跑。印象中只能写本地吧。就是你把接口程序放服务器上。写文件的过程和本地是一样的 参考技术A HttpURLConnection貌似是web交互,如果需要与web交互的话在服务器上你得先写一个asp文件或者其他jsp等文件。建议查阅java与web交互这一块的内容。这个页面挺详细的,你应该能看得懂的吧。http://blog.csdn.net/a9529lty/article/details/6454145

如果要直接写到服务器上,或者采用socket,当然,服务器也需要有socketserver。
参考技术B 用Socket

HttpURLConnection只能读取服务器的数据不能往服务器传输数据

在 Java 中使用 IO 流

【中文标题】在 Java 中使用 IO 流【英文标题】:Using IO Streams in Java 【发布时间】:2010-12-22 21:19:43 【问题描述】:

我需要使用 Java 启动一个二进制文件,然后使用输入和输出流与之交互。我编写了一个原型来弄清楚它是如何工作的,但到目前为止我得到的唯一输出是null。然而,当独立运行时,子程序会产生输出。我做错了什么?

import java.io.*;

public class Stream 
    public static void main(String args[]) 
    Process SaddleSumExec = null;
    BufferedReader outStream = null;
    BufferedReader inStream = null;

    try 
        SaddleSumExec = Runtime.getRuntime().exec("/home/alex/vendor/program weights.txt list.txt");
    
    catch(IOException e) 
        System.err.println("Error on inStream.readLine()");
        e.printStackTrace();
    

    try 
        inStream = new BufferedReader(new InputStreamReader
                      (SaddleSumExec.getInputStream()));
        System.out.println(inStream.readLine());
    
    catch(IOException e)
        System.out.println("Error.");
    

    

【问题讨论】:

也许你的程序出错了,但除非你阅读它的输出(并显示它)你不会知道它是什么。我建议你使用 ProcessBuilder 来加入 err 和 out 流。 彼得,您能否提交您的评论作为答案,以便我接受?谢谢。 【参考方案1】:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;

public class Prompt 
//flag to end readers and writer
boolean processEnd = false;

public static void main(String[] args) 
    new Prompt();


public Prompt() 

    Process SaddleSumExec = null;
    Input in = new Input(this);
    Output out = new Output(this);
    Input err = new Input(this);
    //thread to read a write console
    Thread t1 = new Thread(in);
    Thread t2 = new Thread(out);
    Thread t3 = new Thread(err);

    try 
        SaddleSumExec = Runtime
                .getRuntime()
                .exec(
                         "ConsoleApplication1/bin/Debug/ConsoleApplication1");

        in.input = SaddleSumExec.getInputStream();
        err.input = SaddleSumExec.getErrorStream();
        out.out = SaddleSumExec.getOutputStream();
        t2.start();
        t1.start();
        t3.start();

        SaddleSumExec.waitFor();
        processEnd = true;

     catch (IOException e) 
        System.err.println("Error on inStream.readLine()");
        e.printStackTrace();
     catch (InterruptedException e) 
        e.printStackTrace();
    



public boolean isProcessEnd() 
    return processEnd;


public void setProcessEnd(boolean processEnd) 
    this.processEnd = processEnd;

/*Readers of Inputs*/
class Input implements Runnable 
    private BufferedReader inStream;
    InputStream input;
    Prompt parent;

    public Input(Prompt prompt) 
        // TODO Auto-generated constructor stub
        parent = prompt;
    

    public void run() 
        inStream = new BufferedReader(new InputStreamReader(input));
        while (!parent.isProcessEnd()) 
            try 
                String userInput;
                while ((userInput = inStream.readLine()) != null) 
                    System.out.println(userInput);
                
             catch (IOException e) 
                // TODO Auto-generated catch block
                e.printStackTrace();
            
        
    

/*Writers of Output*/
class Output implements Runnable 
    OutputStream out;
    Prompt parent;

    public Output(Prompt prompt) 
        parent = prompt;
        // TODO Auto-generated constructor stub
    

    @Override
    public void run() 

        while (!parent.isProcessEnd()) 
            try 
                String CurLine = "";
                InputStreamReader converter = new InputStreamReader(
                        System.in);
                BufferedReader in = new BufferedReader(converter);

                while (!(CurLine.equals("quit"))) 
                    CurLine = in.readLine();
                    if (!(CurLine.equals("quit"))) 
                        out.write((CurLine + "\n").getBytes());
                        out.flush();
                    
                
             catch (IOException e) 
                // TODO Auto-generated catch block
                e.printStackTrace();
            
        
    

【讨论】:

【参考方案2】:

您似乎没有等待子进程结束,因此父进程可能在它有机会读取输出流之前就结束了。

这是一篇关于 Runtime.exec 的古老但优秀的文章

http://www.javaworld.com/jw-12-2000/jw-1229-traps.html

正确的实现在这个页面上

http://www.javaworld.com/jw-12-2000/jw-1229-traps.html?page=4

【讨论】:

【参考方案3】:

据我所知 - 这里可能有两个问题:

    您是否尝试在子程序开始读取之前获得对流的访问权限? 您是否正在运行访问权限不足的父进程?

【讨论】:

(1) 没有任何意义。我假设您的意思是“写作”,但它仍然没有任何意义。它是一个 Reader,它会阻塞直到数据可用。【参考方案4】:

如果您从 readLine() 中读取 null,则表示对等方已关闭流。没有输出。

【讨论】:

以上是关于在JAVA中我得到两个文件流,一个是本地的,一个是服务器上的,怎么将本地的流写入到服务器的流中的主要内容,如果未能解决你的问题,请参考以下文章

Nifi:如何在 nifi 中同步两个目录

如何在颤动中使用流构建器刷新小部件

Java IO操作:合并流

java 通过流的方式读取本地图片并显示在jsp 页面上(类型以jpgpng等结尾的图片)

java io流如何读取文件效率高

java流