相关疑难解决方法(0)

在Java中关闭嵌套流和编写器的正确方法

注意:这个问题及其大多数答案都发布在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 java-io

92
推荐指数
6
解决办法
4万
查看次数

url.openStream有害吗?

我正在使用该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中读取.然后,代码抛出异常,因此它不是良好编码实践的堡垒.

java networking

6
推荐指数
1
解决办法
2331
查看次数

通过app-engine端点api提供blobstore映像

我正在构建一个app-engine端点api,它从用户(Android应用程序)获取图片并以编程方式将其保存到blobstore.然后我将blob_key保存在我的数据存储区中.代码如下:

  • 首先,我通过我接收到的图像@endpoint.methodmessages.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

6
推荐指数
0
解决办法
4098
查看次数

在Java中从URL读取/写入内容的首选方法是什么

打开与网站的连接然后随后阅读该页面上的信息的首选方法是什么?关于不同部分似乎有许多具体问题,但没有明确和简单的例子.

java url

4
推荐指数
1
解决办法
1104
查看次数