我的背景是.net,我对Java很新.我正在为我们公司的java团队做一些工作,架构师需要我实现一个带有InputStream(java.io)对象的方法.为了实现方法的目的,我需要将其转换为字节数组.是否有捷径可寻?
具体来说,我将文件上传保存到Lift Web应用程序中的本地文件.
是否有任何可能的方法来创建FileInputStream标记支持的功能true?
我正在尝试使用Scala中的基本Java代码从文件中读取并写入OutputStream,但是当我在Scala中使用通常的while(!= -1)时,会给出一个警告"比较Unit和Int的类型! =总是会产生真实的".
代码如下:
val file = this.cache.get(imageFileEntry).getValue().asInstanceOf[File]
response.setContentType( "image/%s".format( imageDescription.getFormat() ) )
val input = new BufferedInputStream( new FileInputStream( file ) )
val output = response.getOutputStream()
var read : Int = -1
while ( ( read = input.read ) != -1 ) {
output.write( read )
}
input.close()
output.flush()
Run Code Online (Sandbox Code Playgroud)
我应该如何从输入流写入Scala中的输出流?
我最感兴趣的是类似Scala的解决方案.
我目前正在开发一个Android应用程序,它从提供JSON数据的API获取数据.我将JSON数据的项目存储为字符串,导致出现一些奇怪的字符(例如'Â').我理解这与字符集有关,因此我将InputStreamReader设置为"UTF-8",但它似乎没有解决问题.
URL hukd = new URL(requestUrl);
URLConnection tc = hukd.openConnection();
BufferedReader in = new BufferedReader(new InputStreamReader(tc.getInputStream(), "UTF-8"));
String line = in.readLine();
Log.d("line :", line);
JSONObject obj = new JSONObject(line);
JSONArray ja = obj.getJSONObject("deals").getJSONArray("items");
for (int i = 0; i < ja.length(); i++) { // each deal
JSONObject jo = (JSONObject) ja.get(i);
// make the deal
Deal d = new Deal(jo.getString("title"),
jo.getString("description"),
jo.getString("price"),jo.getString("temperature"),
jo.getJSONObject("merchant").getString("name"),
jo.getString("deal_image"),
jo.getString("deal_image_highres"));
listItems.add(d);
Log.d("Deal:", d.toString());
}
Run Code Online (Sandbox Code Playgroud)
Log.d"line"给出
01-30 19:56:01.909: D/line :(610): {"deals":{"items":[{"title":"Absolute steal ** Harmony one remote …Run Code Online (Sandbox Code Playgroud) 如何读取Android应用程序中的文本文件:
"1.something written
2.in this file
3.is to be read by
4.the InputStream
..."
Run Code Online (Sandbox Code Playgroud)
所以我可以返回一个字符串,如:
"something written\nin this file\nis to be read by\nthe InputStream"
Run Code Online (Sandbox Code Playgroud)
我想到的是(伪代码):
make an inputstream
is = getAssest().open("textfile.txt"); //in try and catch
for loop{
string = is.read() and if it equals "." (i.e. from 1., 2., 3. etc) add "/n" ...
}
Run Code Online (Sandbox Code Playgroud) 我一直在阅读InputStream,FileInputStream,ByteArrayInputStream以及它们的使用方式似乎非常清楚(输出流也是如此).
我正在努力的是理解FilterInputStream和FilterOutputStream的用法:
InputStream in = SomeClass.getInputStream(...);
BufferedInputStream bis = new BufferedInputStream(in);
try {
// read data from bis
} finally {
bis.close();
in.close();
}
Run Code Online (Sandbox Code Playgroud)
javadoc for BufferedInputStream.close()未提及底层流是否已关闭:
关闭此输入流并释放与该流关联的所有系统资源.关闭流后,进一步的read(),available(),reset()或skip()调用将抛出IOException.关闭先前关闭的流无效.
显式调用是in.close()必要的,还是应该通过调用来关闭bis.close()?
我尝试在Swift中使用NSOutputStream和NSInputStream发送和接收数据.发送数据运行良好,但我对接收有一些疑问.
我找到了一个处理NSStreamEvent的解决方案,我试过了.
首先是我初始化连接的功能:
func initNetworkCommunication(){
var host : CFString = "127.0.0.1"
var port : UInt32 = 7001
var readstream : Unmanaged<CFReadStream>?
var writestream : Unmanaged<CFWriteStream>?
CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, host, port, &readstream, &writestream)
inputstream = readstream!.takeRetainedValue()
outputstream = writestream!.takeRetainedValue()
inputstream.delegate = self
outputstream.delegate = self
inputstream.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)
outputstream.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)
inputstream.open()
outputstream.open()
}
Run Code Online (Sandbox Code Playgroud)
这部分正在运作.我已将委托设置为self,因此我应该能够处理此类中的NSStreamEvents.
func stream(aStream: NSStream, handleEvent eventCode: NSStreamEvent) {
switch (eventCode){
case NSStreamEvent.OpenCompleted:
NSLog("Stream opened")
break
case NSStreamEvent.HasBytesAvailable:
NSLog("HasBytesAvailable")
break
case NSStreamEvent.ErrorOccurred:
NSLog("ErrorOccurred")
break
case NSStreamEvent.EndEncountered:
NSLog("EndEncountered")
break
default:
NSLog("unknown.") …Run Code Online (Sandbox Code Playgroud) 我们有一个客户端服务器应用,1个服务器,大约10个客户端.它们使用自定义查询通过tcp套接字进行通信.
该系统运行平稳了好几个月,但在某些时候,在每日计划服务器FULL GC耗时约50秒后,我们发现客户端发送的查询与从服务器收到的响应之间的时间很长,> 10-20s.系统恢复3个小时后,一切都恢复正常.
在调查问题时,我们发现:
我们在服务器上进行了一次线程转储:
java.lang.Thread.State: RUNNABLE
at java.io.FilterInputStream.read(FilterInputStream.java:83)
at util.network.BytesBasedSocketConnection$ReadConnectionRunnable.run(BytesBasedSocketConnection.java:293)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:178)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:292)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
Run Code Online (Sandbox Code Playgroud)
该FilterInputStream.read()如下:
public int read() throws IOException {
return in.read();
}
Run Code Online (Sandbox Code Playgroud)
在in我们的代码是一个BufferedInputStream.
问题是:为什么大多数连接在完全GC暂停后放慢了?为什么stacktrace结束FilterInputStream.read()?它不应该BufferedInputStream在套接字输入流中的某个地方结束吗?这读取会导致服务器上的高负载吗?
我们用于阅读的代码:
int constructLength = _socketDIS.readInt();
ByteArrayOutputStream constructBOAS = new ByteArrayOutputStream(constructLength);
for (int i = 0; i != constructLength; i++) …Run Code Online (Sandbox Code Playgroud) inputstream ×10
java ×8
android ×2
outputstream ×2
scala ×2
file ×1
high-load ×1
integration ×1
json ×1
lift ×1
networking ×1
nsstream ×1
sockets ×1
stream ×1
swift ×1
utf-8 ×1