标签: outputstream

如何有效地将未压缩的InputStream转换为gzip的InputStream?

用户将大文件上传到我的网站,我想将文件gzip并存储在blob中.所以我有一个未压缩的InputStream,blob需要一个InputStream.我知道如何使用GZIPOutputStream将InputStream压缩为Outputstream,但是如何从gzip的OutputStream返回到blob所需的InputStream.

我能找到的唯一方法是使用ByteArrayOutputStream,然后使用toByteArray创建一个新的InputStream.但这意味着我在内存中拥有该文件的完整副本.如果JDBC驱动程序实现将流转换为byte []也不会让我感到惊讶,因此我在内存中有两个副本.

java gzip blob inputstream outputstream

6
推荐指数
1
解决办法
1475
查看次数

Java控制台输出 - 文件和控制台BOTH

可能这个帖子是重复但有人可以指导吗?我想同时将java程序输出写入控制台文件.我知道我可以使用这段代码将输出发送到控制台

    PrintStream orgStdout = null;
    PrintStream fileStdout = null;

    orgStdout = System.out;
    try {
        fileStdout = new PrintStream(new FileOutputStream("C:\\testlogger.txt"));
        System.setOut(fileStdout);
        System.out.println("==============");
        for (int i = 0; i < 10; i++){
            System.out.println("" + i);
        }
        System.out.println("==============");
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
Run Code Online (Sandbox Code Playgroud)

但如何在控制台和文件上保持输出?

PS:没有找到我在文件中输出并在不同线程中显示控制台的选项.

java outputstream core

6
推荐指数
1
解决办法
2882
查看次数

蓝牙连接; 无法正确发送字符串

当我需要将Strings从我的服务器bluetooth-socket发送到我的客户端bluetooth-socket时,我的程序会遇到麻烦.只要我一次只发送一个字符串(例如聊天),但是如果我需要在短时间内编写更多字符串(以交换信息),一切都可以正常工作,字符串将不会从客户端代码中分离出来.例如,如果我发送"FirstUser"并且在"SecondUser"之后,客户端不读取"FirstUser",然后读取"SecondUser".它将显示"FirstUserSecondUser".我该如何避免这种行为?

编辑:如果我让线程在能够发送新消息之前进入睡眠状态,它会读取正确的字符串,但此解决方案无法正常工作.

服务器代码:发送给所有客户端(已编辑)

   public synchronized void sendToAll(String message)
{   
    try {
        Thread.sleep(100);
    } catch (InterruptedException e1) {
        e1.printStackTrace();
    }

    publishProgress(message);
    for(OutputStream writer:outputList) {
        try {
            writer.write(message.getBytes());
            writer.flush();
        } catch (IOException e) {
            System.out.println("Some-Error-Code");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

服务器代码:从客户端读取:

   public void run() {
    String nachricht;
    int numRead;
    byte[] buffer = new byte[1024];
    while (runningFlag) 
    {
        try {
            if((numRead = inputStream.read(buffer)) >= 0) { 
                nachricht = new String(buffer, 0, numRead);
                serverThread.handleMessage(nachricht); 
            }
            }
             catch (IOException e) {
                this.cancel();
                e.printStackTrace();
            }
    } 
} 
Run Code Online (Sandbox Code Playgroud)

客户代码:从服务器读取(已编辑) …

java android bluetooth inputstream outputstream

6
推荐指数
1
解决办法
2560
查看次数

如何通过响应OutputStream将zip文件返回到浏览器?

在这种情况下,我创建了一个包含搜索结果文件的zip文件,并尝试将其发送给用户.这是我目前正在尝试使用的代码块.

File[] zippable = new File[files.size()];
File resultFile = ZipCreator.zip(files.toArray(zippable), results);
InputStream result = new FileInputStream(resultFile);
IOUtils.copy(result, response.getOutputStream());
Run Code Online (Sandbox Code Playgroud)

但是,这目前无法正常工作.它不返回我创建的zip文件,而是返回一个html文件.如果我之后手动更改文件扩展名,我可以看到该文件的内容仍然是我需要的搜索结果.所以问题只在于返回响应的正确扩展.

有没有人对这种情况有任何建议?

java zip outputstream

6
推荐指数
1
解决办法
1万
查看次数

Android BluetoothSocket OutputStream无限地写入块

我需要以编程方式将1到100 MB的数据以1024字节的块写入远程蓝牙设备.两者都是Android设备.以下是我的客户端程序中传输数据的示例代码段 -

bTSocket.connect(); //connect to remote BT device
DataOutputStream outStream = new DataOutputStream(bTSocket.getOutputStream());
byte[] buffer = new byte[1024];
int bytesToTransfer = 1000000;
while (bytesToTransfer > 0) {
    outStream.write(buffer);
    outStream.flush();
    bytesToTransfer -= 1024;
}
outStream.close();
Run Code Online (Sandbox Code Playgroud)

在Android 2.2(Froyo)上运行这段代码时,它运行正常.但是在Android 2.3.4和4.0.4的情况下,outStream.write(缓冲区)在传输一些数据(比如100 KB)后无限地阻塞.值得一提的是,远程设备未配置为监听数据.对可写入的数据量有任何限制吗?

sockets android bluetooth outputstream

6
推荐指数
1
解决办法
5044
查看次数

并行写入标准OutputStream

我正在编写一个应用程序,它涉及将相当大的数据块写入OutputStream(属于Socket).使这有点复杂的是,通常有多个线程试图写入同一个OutputStream.目前,我设计它使得要写入数据的OutputStream在它自己的线程中.该线程包含一个队列(LinkedList),它轮询字节数组并尽快写入它们.

private class OutputStreamWriter implements Runnable {

    private final LinkedList<byte[]> chunkQueue = new LinkedList<byte[]>();

    public void run() {
        OutputStream outputStream = User.this.outputStream;
        while (true) {
            try {
                if (chunkQueue.isEmpty()) {
                    Thread.sleep(100);
                    continue;
                }
                outputStream.write(chunkQueue.poll());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这种设计的问题在于,随着越来越多的写入发生,越来越多的数据排队,并且不会更快地写入.最初,当数据被放入队列时,它几乎立即被写入.然后大约15秒后,数据开始落后; 从数据排队的时间到实际写入数据的时间延迟.随着时间的推移,这种延迟变得越来越长.这是非常明显的.

解决这个问题的一种方法是使用某种ConcurrentOutputStream实现,它允许在不阻塞的情况下发送数据,这样就不会开始备份写入(哎呀,队列就没必要了).我不知道是否有这样的实现 - 我一直找不到 - 我个人认为甚至不可能写一个.

那么,有没有人对我如何重新设计这个有什么建议?

java sockets queue outputstream

6
推荐指数
1
解决办法
3148
查看次数

输入流与输出流有何不同?

我看到两者都是数据的"流".在那种情况下,为什么认为它们不同?真的有什么区别?

评论 - 请不要关闭此问题.这是一种基本的东西,可以在面试中混淆人们.

更新1 - 每个人似乎都说同样的事情 - 你从IS读取并写入操作系统.所以,它们基本相同.就像一条水流过它的管道.当您使用该管道中的水时,您将其称为InputStream,当您将水泵入其中时,它称为输出流.它真的那么微不足道吗?

UPDATE2 - 如果差异不那么"大",那么我们可以有一个InAndOutStream而不必为两个类(InputStream和OutputStream)创建代码吗?

java inputstream outputstream

6
推荐指数
2
解决办法
5311
查看次数

如何将log4j输出重定向到我的HttpServletResponse输出流?

我在JBoss AS 7.1.1.Final上部署的Spring 3.1.1.RELEASE应用程序中使用log4j 1.2.15.我正在尝试将log4j中写入的输出路由到我的响应输出流.我有这样写的输出

private static final Logger LOG = Logger.getLogger(TrainingSessionServiceImpl.class);
…
LOG.info("Creating/updating training session associated with order #:" + order.getId());
Run Code Online (Sandbox Code Playgroud)

我正试图将它路由到我的输出流,如此...

@RequestMapping(value = "/refreshPd", method = RequestMethod.GET)
public void refreshPD(final HttpServletResponse response) throws IOException
{
    ...        
    final WriterAppender appender = new WriterAppender(new PatternLayout("%d{ISO8601} %p - %m%n"),response.getWriter());
    appender.setName("CONSOLE_APPENDER");
    appender.setThreshold(org.apache.log4j.Level.DEBUG);
    Logger.getRootLogger().addAppender(appender);

    worker.work();

    Logger.getRootLogger().removeAppender("CONSOLE_APPENDER");
Run Code Online (Sandbox Code Playgroud)

但遗憾的是,即使我知道(通过调试)日志语句被调用,也没有任何东西输出到我的浏览器.有谁知道如何调整我的设置以使其工作?下面是我的log4j.properties文件,部署到我的wAR的WEB-INF/classes目录.

log4j.rootLogger=DEBUG, CA, FA

#Console Appender
log4j.appender.CA=org.apache.log4j.ConsoleAppender
log4j.appender.CA.layout=org.apache.log4j.PatternLayout
log4j.appender.CA.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n

#File Appender
log4j.appender.FA=org.apache.log4j.FileAppender
log4j.appender.FA.File=/usr/java/jboss/server/default/log/log4j.log
log4j.appender.FA.layout=org.apache.log4j.PatternLayout
log4j.appender.FA.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n …
Run Code Online (Sandbox Code Playgroud)

spring servlets log4j outputstream httpresponse

6
推荐指数
1
解决办法
5470
查看次数

如何使用outputstream在java中添加附件到电子邮件

我已经看到了javax.mail库的代码,你可以在其中添加附件到电子邮件:

MimeBodyPart attachmentPart = new MimeBodyPart();
FileDataSource fds = new FileDataSource("C:/text.txt");
attachmentPart.setDataHandler(new DataHandler(fds));
attachmentPart.setFileName("text.txt");
multipart.addBodyPart(attachmentPart);
Run Code Online (Sandbox Code Playgroud)

但这需要该文件驻留在此磁盘上的某个位置.我想直接从电子邮件库中获取一个输出流,并直接从我写入该输出流的另一个地方将文件内容流入其中.这可能吗?

java email file-io outputstream

6
推荐指数
2
解决办法
1万
查看次数

Android蓝牙输入/输出流:已发送〜1400字节,已接收1008

我正在尝试在两部Android 4.0.1手机之间发送数据,而当我发送数据时,我在另一侧没有收到完整的阵列。

我的代码:

byte[] buffer = new byte[4096];
int bytes;

bytes = inputStream.read(buffer);
// bytes = 1008
// buffer[1008..4095] = 0 
// =================== other side =============================
byte[] message = Tools.concatByteArray(response, authorizationMessage);

// Debug tells me that the array has 1400 bytes
outputStream.write(message);
outputStream.flush();
Run Code Online (Sandbox Code Playgroud)

调试中的消息是:

[102, -32, 27, 23, 31, 111, -43, 124, 105, -122, 89, 13, 80, 62, 107, -21, 44, -93, -24, 100, -28, 18, -10, -55, 8, -7, 95, -82, -127, -125, -13, -14, 82, 93, -112, 33, …
Run Code Online (Sandbox Code Playgroud)

android bytearray bluetooth inputstream outputstream

5
推荐指数
1
解决办法
3216
查看次数