我有一个InputStreamReader(与a结合BufferedReader).
我想循环阅读Stream的内容
while((line = MyStream.readLine()) != null) {
s.o.p(line);
String lastline;
}
Run Code Online (Sandbox Code Playgroud)
但这会创建一个没有结束的循环,所以我的整个程序等待循环结束..然后等待...等待.
目前,我有一种方法可以说明应该读取多少行.这很好,但非常不灵活.
我此刻的方法
public void getStatus(int times) throws IOException {
for (int i = 0; i < times; i++) {
System.out.println(fromServer.readLine());
}
Run Code Online (Sandbox Code Playgroud)
我希望这个方法读取所有行并将最后一行保存在不带"times"参数的字符串中.
我现在遇到了通过TCP反序列化对象的问题.
反序列化时,我得到以下SerializationException(下面的代码):
附加信息:二进制流'0'不包含有效的BinaryHeader.可能的原因是序列化和反序列化之间的无效流或对象版本更改.
序列化代码:
public static void SerializeRO(Stream stream, ReplicableObject ro) {
MemoryStream serializedObjectStream = new MemoryStream();
Formatter.Serialize(serializedObjectStream, ro);
BinaryWriter bw = new BinaryWriter(stream);
bw.Write(serializedObjectStream.Length);
serializedObjectStream.WriteTo(stream);
serializedObjectStream.Close();
bw.Close();
}
Run Code Online (Sandbox Code Playgroud)
反序列化代码:
public static List<ReplicableObject> ParseStreamForObjects(Stream stream) {
List<ReplicableObject> result = new List<ReplicableObject>();
while (true) {
if (!(stream as NetworkStream).DataAvailable) break;
BinaryReader br = new BinaryReader(stream);
int length = br.ReadInt32();
byte[] bytes = br.ReadBytes(length);
MemoryStream ms = new MemoryStream(bytes);
ms.Position = 0;
// ERROR OCCURS ON THE LINE BELOW
result.Add((ReplicableObject) Formatter.Deserialize(ms));
ms.Close(); …Run Code Online (Sandbox Code Playgroud) 我想在一行中找到一个' - '字符,但是这个字符用于指定一个范围.我可以得到一个包含' - '字符的sed模式示例吗?
此外,如果我可以使用包含除空格和制表符之外的所有字符的模式,则会更快.
这是我的代码:
MemoryStream xmlStream = new MemoryStream();
XmlDocument xmlDoc = new XmlDocument();
XmlWriter xmlWriter = XmlWriter.Create(xmlStream);
//Add some elements and attributes.
xmlWriter.WriterEndDocument();
xmlWriter.Flush();
xmlWriter.Close();
Run Code Online (Sandbox Code Playgroud)
好的,现在我已经关闭了XmlWriter,有没有办法再次访问XmlStream?
如果我不关闭,那么当我想使用xmlDoc.Load(xmlStream)时,它会给出一个异常,说"Root Element is missing"
在回调中,NetworkStream.BeginRead我似乎注意到始终读取所有字节。我看到许多教程检查BytesRead是否小于总字节,如果是,请再次读取,但是似乎从来没有。
if (bytesRead < totalBytes)即使一次发送大量数据(数千个字符),并且即使缓冲区大小设置为非常小的值(大约16个),该条件也永远不会触发。
我没有使用“老式方式”进行测试,因为我正在使用Task.Factory.FromAsync而不是调用NetworkStream.BeginRead并提供一个我称为EndRead的回调。也许Tasks自动包含了直到读取完所有数据才返回的功能?我不确定。
无论哪种方式,我仍然对何时不能一次读取所有数据感到好奇。甚至需要检查是否未读取所有数据,如果需要,则再次读取?我似乎无法获得有条件运行的条件。
谢谢。
我正在尝试编写一个将信息写入流的函数.我需要能够传递一个字符串流或ostream.我尝试使用声明函数F(std::ios* out),但后来当我使用<<运算符写入它时,我得到了这个错误:error: no match for operator<<.我该如何宣布这个功能呢?
我正在获取一个httpwebresponse流(一个flash文件),我想将它保存为二进制文件,然后访问该二进制文件并将其显示为flash.现在,我正在将响应流写入MemoryStream,然后在MemoryStream上调用ToArray().我得到一个方便的字节[].
我该如何扭转这个功能?如何从我生成的byte []中获取flash文件的流?
谢谢!
免责声明:不要::feof()用作你的循环条件. 例如,请参阅以下答案: 文件读取:二进制文件的feof()
但是,我有"真正的"代码,它演示了一个不能::feof()用作我的循环条件的问题,但是LOGICALLY,这是演示问题的最简单方法.
请考虑以下事项:我们一次迭代一个字符流:
FILE* my_file;
// ...open "my_file" for reading...
int c;
while(0 == ::feof(my_file))
{ // We are not at EOF
c = ::getc(my_file);
// ...process "c"
}
Run Code Online (Sandbox Code Playgroud)
上面的代码按预期工作: 文件一次处理一个char,然后EOF我们退出.
但是,以下是出乎意料的行为:
FILE* my_file;
// ...open "my_file" for reading...
int c;
while(0 == ::_eof(::fileno(my_file)))
{ // We are not at EOF
c = ::getc(my_file);
// ...process "c"
}
Run Code Online (Sandbox Code Playgroud)
我原以为他们会这样做. ::fileno()每次都正确返回(整数)文件描述符.但是,测试只::_eof(::fileno(my_file))运行一次,然后在第二次尝试时返回1(指示a EOF).
我不明白. …
我正在制作一个记录器.我想创建一个log()以流作为输入的函数.
例如:
log("hello"<<" "<<"world"<<10<<"\n");
Run Code Online (Sandbox Code Playgroud)
我也希望它是线程安全的.
我重新定义了<<运算符,所以我可以这样做:
log()<<"hello"<<"world"<<10<<"\n"
Run Code Online (Sandbox Code Playgroud)
但是这个操作不是线程安全的.
如何使其线程安全?