我想编写一个函数来输出ostream传入的内容,并返回流,如下所示:
std::ostream& MyPrint(int val, std::ostream* out) {
*out << val;
return *out;
}
int main(int argc, char** argv){
std::cout << "Value: " << MyPrint(12, &std::cout) << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
打印这样的值会很方便,并将函数调用嵌入到输出操作符链中,就像我一样main().
但它不起作用,打印出来:
$ ./a.out
12Value: 0x6013a8
Run Code Online (Sandbox Code Playgroud)
期望的输出是这样的:
Value: 12
Run Code Online (Sandbox Code Playgroud)
我怎样才能解决这个问题?我是否必须定义一个operator<<?
更新:澄清了所需的输出.
更新2:有些人不明白为什么我会打印这样的数字,使用函数而不是直接打印它.这是一个简化的例子,实际上该函数打印的是复杂的对象而不是int.
我有一个由OutputStream和InputStream组成的通用套接字实现.
在我做了一些工作之后,我正在关闭OutputStream.
完成后,我的InputStream的read()方法返回-1无限的时间,而不是像我预期的那样抛出异常.
我现在不确定最安全的路线,所以我有一些问题:
谢谢!
亲爱的同事们,
我有一个Garden类,我在其中序列化和反序列化多个Plant类对象.序列化正在运行,但是如果想要在mein静态方法中将其分配给调用变量,则反序列化不起作用.
public void searilizePlant(ArrayList<Plant> _plants) {
try {
FileOutputStream fileOut = new FileOutputStream(fileName);
ObjectOutputStream out = new ObjectOutputStream(fileOut);
for (int i = 0; i < _plants.size(); i++) {
out.writeObject(_plants.get(i));
}
out.close();
fileOut.close();
} catch (IOException ex) {
}
}
Run Code Online (Sandbox Code Playgroud)
反序列化代码:
public ArrayList<Plant> desearilizePlant() {
ArrayList<Plant> plants = new ArrayList<Plant>();
Plant _plant = null;
try {
ObjectInputStream in = new ObjectInputStream(new FileInputStream(fileName));
Object object = in.readObject();
// _plant = (Plant) object;
// TODO: ITERATE OVER THE WHOLE STREAM
while (object …Run Code Online (Sandbox Code Playgroud) 我正在尝试做的事情: 我正在尝试编写一个从Android麦克风中读取音频的程序(无需录制),并捕获一些使用服务的大小程度.现在我正在从我的活动向我的服务发送一个脉冲,以获得快速的声音读取,并检查振幅的Logcat打印输出作为我的音量.
我的问题: AudioRecord的read方法返回0.
我尝试过: 录制完整的音频而不是使用NullOutputStream并没有什么区别.一些早期版本在添加了一些微不足道的变化(如logcat调用)后随机开始工作,然后停止工作.
我的想法: 我原本以为可能是其他应用程序正在使用麦克风,但即使这是唯一值得注意的服务,它仍会返回0.
我的服务:
import org.apache.commons.io.output.NullOutputStream;
public class RecordingService extends Service {
public static final int SAMPLE_RATE = 16000;
private AudioRecord mRecorder;
private File mRecording;
private short[] mBuffer;
public static final NullOutputStream NULL_OUTPUT_STREAM = new NullOutputStream();
public double amplitude = 0.0;
public String TAG = "TAG";
public void onCreate() {
super.onCreate();
}
public int onStartCommand(Intent intent, int flags, int startId){
initRecorder();
mRecorder.startRecording();
mRecording = getFile("raw");
startBufferedWrite(mRecording, intent);
mRecorder.stop();
mRecorder.release();
stopSelf();
return START_STICKY;
}
private void …Run Code Online (Sandbox Code Playgroud) 我正在运行一个由另一个人编写的Java程序,该程序的数据比最初为该程序设计的数据多,例如输入文件的10倍,大致是二次运行时.我遇到了不同的问题,现在的目的是一点一点地解决它们,并感谢我能得到的所有帮助 - 非常感谢您的建议!
在执行期间,当已经打印了大量输出(重定向到文件)时,我得到以下输出:
Exception in thread "main" java.lang.StackOverflowError
at java.io.PrintStream.write(PrintStream.java:480)
[...]
at java.io.PrintStream.write(PrintStream.java:480)
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪是第一件令我困惑的事情,因为它是一次又一次地重复同一条线.此外,它无意在代码或执行中出现问题.
我的想法/研究
为PrintStream
搜索"PrintStream"后只搜索代码片段
// reset output stream to suppress the annoying output of the Apache batik library. Gets reset after lib call.
OutputStream tmp=System.out;
System.setOut(new PrintStream(new org.apache.commons.io.output.NullOutputStream()));
drawRes.g2d.stream(new FileWriter(svgFilePath), false);
System.setOut(new PrintStream(tmp));
Run Code Online (Sandbox Code Playgroud)征求意见
如果您对正在进行的工作有什么建议,那么Java代码具体做什么,请帮助我理解它.特别是堆栈跟踪让我感到沮丧,因为它没有提供开始修复的地方.我也很感谢有关如何解决此问题,获取堆栈跟踪,修复代码以避免StackOverflow等的一般方法.
一些系统环境事实
Java的
openjdk version "1.8.0_121"
OpenJDK Runtime Environment (IcedTea 3.3.0) (suse-28.1-x86_64)
OpenJDK 64-Bit Server VM (build 25.121-b13, mixed mode) …Run Code Online (Sandbox Code Playgroud)我希望可以帮助我解决文件创建/响应问题.我知道如何创建和保存文件.我知道如何通过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) 我需要将一个流转换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字节的缓冲区才能刷新,这简直太迟了.
我开始并运行了一个 Scala 进程。
val dir = "/path/to/working/dir/"
val stockfish = Process(Seq("wine", dir + "stockfish_8_x32.exe"))
val logger = ProcessLogger(printf("Stdout: %s%n", _))
val stockfishProcess = stockfish.run(logger, connectInput = true)
Run Code Online (Sandbox Code Playgroud)
该进程读取和写入标准 IO(控制台)。如果进程已经启动,如何向进程发送字符串命令?
Scala 进程 API 具有 ProcessBuilder,它又具有一堆有用的方法。但是 ProcessBuilder 是在进程开始编写复杂的 shell 命令之前使用的。Scala 也有 ProcessIO 来处理输入或输出。我也不需要。我只需要向我的进程发送消息。
在 Java 中,我会做这样的事情。
String dir = "/path/to/working/dir/";
ProcessBuilder builder = new ProcessBuilder("wine", dir + "stockfish_8_x32.exe");
Process process = builder.start();
OutputStream stdin = process.getOutputStream();
InputStream stdout = process.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(stdout));
BufferedWriter writer = new …Run Code Online (Sandbox Code Playgroud)