我有一个软件允许在javascript文件(.js)中编写附加组件,允许使用Java函数(我不知道这是否常见,我以前从未在javascript文件中看过java调用)
我需要从网络服务器下载二进制文件并将其写入硬盘.我尝试了以下代码:
baseencoder = new org.apache.commons.codec.binary.Base64();
url = new java.net.URL("https://server/file.tgz");
urlConnect = url.openConnection();
urlConnect.setDoInput(true);
urlConnect.setDoOutput(true);
urlConnect.setRequestProperty("authorization","Basic "+ java.lang.String(baseencoder.encodeBase64(java.lang.String( username + ":" + password ).getBytes())));
urlConnect.setRequestProperty("content-type","application/x-www-form-urlencoded");
is = new java.io.DataInputStream(urlConnect.getInputStream());
fstream = new FileWriter("C:\\tmp\\test.tgz");
out = new BufferedWriter(fstream);
while((data = is.read()) != -1){
out.write(data);
}
out.close();
is.close();
Run Code Online (Sandbox Code Playgroud)
生成的文件不再是有效的gzip存档.如果我犯了一个很大的错误,我很抱歉,但我不是程序员,也不太了解Java.
我希望可以帮助我解决文件创建/响应问题.我知道如何创建和保存文件.我知道如何通过ServletOutputStream将该文件发送回用户.
但我需要的是创建一个文件,而不是将其保存在磁盘上,然后通过ServletOutputStream发送该文件.
上面的代码解释了我所拥有的部分.任何帮助赞赏.提前致谢.
// This Creates a file
//
String text = "These days run away like horses over the hill";
File file = new File("MyFile.txt");
Writer writer = new BufferedWriter(new FileWriter(file));
writer.write(text);
writer.close();
// Missing link goes here
//
// This sends file to browser
//
InputStream inputStream = null;
inputStream = new FileInputStream("C:\\MyFile.txt");
byte[] buffer = new byte[8192];
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int bytesRead;
while ( (bytesRead = inputStream.read(buffer)) != -1)
baos.write(buffer, 0, bytesRead);
response.setContentType("text/html");
response.addHeader("Content-Disposition", "attachment; …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用HttpServletResponse(HttpServlet)创建一个UTF-8文件"myFile.aaa".我之所以需要它是UTF-8,是因为它可能包含特殊的不可打印字符.
但是,下面的代码似乎创建了ANSI编码的文件.至少这是Notepad ++所说的,以及从这个文件中读取字符的内容.我究竟做错了什么?
谢谢
public void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException
{
res.setHeader("Content-Type", "application/octet-stream; charset=UTF-8");
res.setHeader("Content-Disposition","attachment;filename=myFile.aaa");
res.setCharacterEncoding("UTF-8");
ServletOutputStream os = res.getOutputStream();
os.print("Hello World");
os.flush();
os.close();
}
Run Code Online (Sandbox Code Playgroud) 我想拦截标准输出流,然后将内容复制到另一个流,但我也希望保持标准输出流像原始.我可以用Java实现吗?
我想通过Socket发送多个随机值.我认为数组是发送它们的最佳方式.但是我不知道如何将数组写入Socket outputStream?
我的java类
public class NodeCommunicator {
public static void main(String[] args) {
try {
Socket nodejs = new Socket("localhost", 8181);
Random randomGenerator = new Random();
for (int idx = 1; idx <= 1000; ++idx){
Thread.sleep(500);
int randomInt = randomGenerator.nextInt(35);
sendMessage(nodejs, randomInt + " ");
System.out.println(randomInt);
}
while(true){
Thread.sleep(1000);
}
} catch (Exception e) {
System.out.println("Connection terminated..Closing Java Client");
System.out.println("Error :- "+e);
}
}
public static void sendMessage(Socket s, String message) throws IOException {
s.getOutputStream().write(message.getBytes("UTF-8"));
s.getOutputStream().flush();
}
}
Run Code Online (Sandbox Code Playgroud) 我用a ProcessBuilder来运行进程.我通过提交在线程池(Executors.newCachedThreadPool())中处理它们的相应runnable来处理输入/输出流.
我得到了结果但是偶尔我什么也得不到.
例如,如果我这样做:cmd \C dir对于流程构建器,我得到了dir返回的结果,但有时我没有得到任何东西(尽管结果似乎从处理它的runnable中恢复process.getInputStream).
我该怎么调试呢?它间歇地出现了.使用相同的代码,我没有遇到任何问题new Thread(runnable).start().它在我切换到线程池后开始发生.
更新:
我想我找到了一些东西:
我在以下方面做了以下事情Runnable:
try {
while ( (line = br.readLine()) != null) {
pw.println(line);
sb.append(line);
}
System.out.println("Finished reading "+sb.length());
} catch (IOException e) {
e.printStackTrace();
}
finally{
pw.flush();
try{
isr.close();
}catch(Exception e){}
}
Run Code Online (Sandbox Code Playgroud)
在不起作用的情况下,它打印Finished reading 521.但我试图通过pw而不是得到结果sb.
pw是PrintWriter pw = PrintWriter(outputStream);`我传递给runnable
更新2:
似乎:在处理输入流的runnable完成之前status = process.waitFor();返回.怎么会发生这种情况?
我在javadoc中读到:.那么这是否意味着我可以在消耗I/O流 …
java multithreading outputstream executorservice processbuilder
我在Swift书中找不到关于io的任何内容.是否有类似于Java的OutputStream或Go的Writer接口的通用协议用于写入字节流?如果您正在编写一个返回流的类,您是否需要编写自己的协议或使用Objective C协议?
要明确我要求Swift原生接口不是因为我避免使用Objective C或Cocoa,而是为了描述Swift到Swift代码的预期行为.
我知道之前已经问过这个问题,但是我无法让它发挥作用.请帮忙.我添加了外部存储权限,为什么它仍然是只读的?
public class MainActivity extends Activity {
public static final String LOGTAG="EXPLORECA";
public static final String USERNAME="pref_username";
public static final String VIEWIMAGE="pref_viewimages";
private SharedPreferences settings;
private OnSharedPreferenceChangeListener listener;
private File file;
private static final String FILENAME = "jasondata";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
settings = PreferenceManager.getDefaultSharedPreferences(this);
listener = new OnSharedPreferenceChangeListener() {
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
String key) {
MainActivity.this.refreshDisplay(null);
}
};
settings.registerOnSharedPreferenceChangeListener(listener);
File extDir = getExternalFilesDir(null);
String path = extDir.getAbsolutePath();
UIHelper.displayText(this, R.id.textView, path);
file = new …Run Code Online (Sandbox Code Playgroud) 我需要将一个流转换char为一个bytes 流,即我需要一个从java.io.Writer接口到a 的适配器java.io.OutputStream,支持任何有效的Charset,我将作为配置参数.
但是,java.io.OutputStreamWriter该类有一个隐藏的秘密:sun.nio.cs.StreamEncoder它委托给下面的对象创建一个8192字节(8KB)的缓冲区,即使你没有要求它.
问题是,OutputStream最后我插入了一个需要计算正在写入的字节数的包装器,以便在输出特定数量的字节后立即停止执行源系统.如果OutputStreamWriter正在创建一个8K缓冲区,我只是被告知生成的字节数太晚,因为它们只会在缓冲区刷新时到达我的计数器(所以已经有超过8,000个已经生成的字节在等待我OutputStreamWriter缓冲).
所以,问题是,有没有在Java运行时的任何地方Writer- > OutputStream桥可以运行无缓冲?
我真的,真的很讨厌自己写这个:( ...
注意:在每次写入时按下flush()OutputStreamWriter不是有效的替代方法.这会带来很大的性能损失(synchronized涉及到一个块StreamEncoder).
注2:我知道可能有必要在桥上保留一个小的char溢出来计算代理.这不是我需要在它生成第n个字节的那一刻停止执行源系统(这是不可能的,因为给定的字节可以byte[]在write调用中以更大的形式出现给我).但是我需要尽快停止它,等待8K,2K甚至200字节的缓冲区才能刷新,这简直太迟了.
进程如何读取自己的输出流?我正在编写自动化测试,该自动化测试在与测试相同的过程中启动了几个应用程序子流程(应用程序)。因此,标准输出是测试输出和应用程序输出的混合。
我想在运行时读取输出流,如果看到应用程序中的错误,则测试失败。这可能/可行吗?如果是这样,我该怎么办?
注意:我知道我可以将应用程序作为独立的进程启动,然后读取它们的输出流。我现在的工作量很大。
还要注意,这并不是Go单元测试中如何测试函数输出(stdout / stderr)的伪装,尽管该票据是相似且有用的。另一个问题是关于捕获单个函数调用的输出。该票证是关于连续读取整个流的信息。正确答案也有所不同-它需要管道。