注意:这个问题及其大多数答案都发布在Java 7发布之前.Java 7提供了自动资源管理功能,可以轻松实现这一目标.如果您使用的是Java 7或更高版本,那么您应该转到Ross Johnson的答案.
什么被认为是在Java中关闭嵌套流的最佳,最全面的方法?例如,考虑设置:
FileOutputStream fos = new FileOutputStream(...)
BufferedOS bos = new BufferedOS(fos);
ObjectOutputStream oos = new ObjectOutputStream(bos);
Run Code Online (Sandbox Code Playgroud)
我理解需要保证关闭操作(可能使用finally子句).我想知道的是,是否有必要明确确保嵌套流已关闭,或者只是确保关闭外部流(oos)?
我注意到的一件事,至少在处理这个具体的例子时,内部流似乎只是抛出FileNotFoundExceptions.这似乎意味着技术上不需要担心如果失败就关闭它们.
这是同事写的:
从技术上讲,如果实施得当,关闭最外层的流(oos)就足够了.但实施似乎有缺陷.
示例:BufferedOutputStream从FilterOutputStream继承close(),它将其定义为:
155 public void close() throws IOException {
156 try {
157 flush();
158 } catch (IOException ignored) {
159 }
160 out.close();
161 }
Run Code Online (Sandbox Code Playgroud)
但是,如果flush()由于某种原因抛出运行时异常,则永远不会调用out.close().所以看起来"最安全"(但很丑陋)主要担心关闭FOS,即保持文件打开.
什么被认为是最好的,当你绝对需要确定,关闭嵌套流的方法?
是否有任何正式的Java/Sun文档可以详细解决这个问题?
我正在使用该java.net.URL.openStream()方法从服务器检索内容.我最近遇到了一个问题,其中HTTP响应代码指示错误,但不是抛出异常,无论如何仍然读取了流.这导致错误出现在执行的后期,并证明是一个红鲱鱼.据我所知,当您使用此方法打开流时,无法检查HTTP响应代码.
我能找到正确处理此问题的唯一方法是在打开流之前获取连接:
HttpURLConnection conn=(HttpURLConnection) url.openConnection()
#Code updated with scotth's suggestion
if(!String.valueOf(conn.getResponseCode()).startsWith('2'))
throw new IOException("Incorrect response code "+conn.getResponseCode()+" Message: " +getResponseMessage());
rawIn=conn.getInputStream()
InputStream in=conn.getInputStream()
Run Code Online (Sandbox Code Playgroud)
所以你同意吗?安全使用openStream是否有任何好的情况,或者不鼓励使用它.值得注意的是,Sun在其教程代码中使用该方法直接从URL中读取.然后,代码抛出异常,因此它不是良好编码实践的堡垒.
我正在构建一个app-engine端点api,它从用户(Android应用程序)获取图片并以编程方式将其保存到blobstore.然后我将blob_key保存在我的数据存储区中.代码如下:
首先,我通过我接收到的图像@endpoint.method为messages.BytesField:
image_data = messages.BytesField(1,required = True)
然后我像这样保存到blobstore:
from google.appengine.api import files
def save_image(data):
# Create the file
file_name = files.blobstore.create(mime_type='image/png')
# Open the file and write to it
with files.open(file_name, 'a') as f:
f.write('data')
# Finalize the file. Do this before attempting to read it.
files.finalize(file_name)
# Get the file's blob key
blob_key = files.blobstore.get_blob_key(file_name)
return blob_key # which is then saved to datastore
Run Code Online (Sandbox Code Playgroud)
现在我想把图像送回来.我不知道如何将以下代码放入我的端点api:
from google.appengine.ext import blobstore
from google.appengine.ext.webapp import blobstore_handlers
class ServeHandler(blobstore_handlers.BlobstoreDownloadHandler): …Run Code Online (Sandbox Code Playgroud) google-app-engine android blobstore python-2.7 google-cloud-endpoints
打开与网站的连接然后随后阅读该页面上的信息的首选方法是什么?关于不同部分似乎有许多具体问题,但没有明确和简单的例子.