用户将大文件上传到我的网站,我想将文件gzip并存储在blob中.所以我有一个未压缩的InputStream,blob需要一个InputStream.我知道如何使用GZIPOutputStream将InputStream压缩为Outputstream,但是如何从gzip的OutputStream返回到blob所需的InputStream.
我能找到的唯一方法是使用ByteArrayOutputStream,然后使用toByteArray创建一个新的InputStream.但这意味着我在内存中拥有该文件的完整副本.如果JDBC驱动程序实现将流转换为byte []也不会让我感到惊讶,因此我在内存中有两个副本.
可能这个帖子是重复但有人可以指导吗?我想同时将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:没有找到我在文件中输出并在不同线程中显示控制台的选项.
当我需要将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)
客户代码:从服务器读取(已编辑) …
在这种情况下,我创建了一个包含搜索结果文件的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文件.如果我之后手动更改文件扩展名,我可以看到该文件的内容仍然是我需要的搜索结果.所以问题只在于返回响应的正确扩展.
有没有人对这种情况有任何建议?
我需要以编程方式将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)后无限地阻塞.值得一提的是,远程设备未配置为监听数据.对可写入的数据量有任何限制吗?
我正在编写一个应用程序,它涉及将相当大的数据块写入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实现,它允许在不阻塞的情况下发送数据,这样就不会开始备份写入(哎呀,队列就没必要了).我不知道是否有这样的实现 - 我一直找不到 - 我个人认为甚至不可能写一个.
那么,有没有人对我如何重新设计这个有什么建议?
我看到两者都是数据的"流".在那种情况下,为什么认为它们不同?真的有什么区别?
评论 - 请不要关闭此问题.这是一种基本的东西,可以在面试中混淆人们.
更新1 - 每个人似乎都说同样的事情 - 你从IS读取并写入操作系统.所以,它们基本相同.就像一条水流过它的管道.当您使用该管道中的水时,您将其称为InputStream,当您将水泵入其中时,它称为输出流.它真的那么微不足道吗?
UPDATE2 - 如果差异不那么"大",那么我们可以有一个InAndOutStream而不必为两个类(InputStream和OutputStream)创建代码吗?
我在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) 我已经看到了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)
但这需要该文件驻留在此磁盘上的某个位置.我想直接从电子邮件库中获取一个输出流,并直接从我写入该输出流的另一个地方将文件内容流入其中.这可能吗?
我正在尝试在两部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)