diff --git a/src/java.desktop/share/classes/java/awt/color/ICC_Profile.java b/src/java.desktop/share/classes/java/awt/color/ICC_Profile.java index 32a02590d9c73..8afdc638d42da 100644 --- a/src/java.desktop/share/classes/java/awt/color/ICC_Profile.java +++ b/src/java.desktop/share/classes/java/awt/color/ICC_Profile.java @@ -927,10 +927,7 @@ public static ICC_Profile getInstance (int cspace) { * not permit read access to the given file */ public static ICC_Profile getInstance(String fileName) throws IOException { - ICC_Profile thisProfile; - InputStream is = null; - - + InputStream is; File f = getProfileFile(fileName); if (f != null) { is = new FileInputStream(f); @@ -940,12 +937,9 @@ public static ICC_Profile getInstance(String fileName) throws IOException { if (is == null) { throw new IOException("Cannot open file " + fileName); } - - thisProfile = getInstance(is); - - is.close(); /* close the file */ - - return thisProfile; + try (is) { + return getInstance(is); + } } /** @@ -1010,14 +1004,13 @@ private void activate() { if (is == null) { return; } - try { + try (is) { byte[] data = getProfileDataFromStream(is); if (data != null) { cmmProfile = CMSManager.getModule().loadProfile(data); // from now we cannot use the deferred value, drop it deferralInfo = null; } - is.close(); /* close the stream */ } catch (CMMException | IOException ignore) { } } @@ -1174,14 +1167,9 @@ static int getPCSType(Profile p) { * error occurs while writing to the file */ public void write(String fileName) throws IOException { - FileOutputStream outputFile; - byte[] profileData; - - profileData = getData(); /* this will activate deferred - profiles if necessary */ - outputFile = new FileOutputStream(fileName); - outputFile.write(profileData); - outputFile.close (); + try (OutputStream out = new FileOutputStream(fileName)) { + write(out); + } } /** @@ -1191,11 +1179,7 @@ public void write(String fileName) throws IOException { * @throws IOException If an I/O error occurs while writing to the stream */ public void write(OutputStream s) throws IOException { - byte[] profileData; - - profileData = getData(); /* this will activate deferred - profiles if necessary */ - s.write(profileData); + s.write(getData()); } /** diff --git a/test/jdk/java/awt/color/ICC_Profile/WriteProfileToFile.java b/test/jdk/java/awt/color/ICC_Profile/WriteProfileToFile.java new file mode 100644 index 0000000000000..0ea4b3b0835c0 --- /dev/null +++ b/test/jdk/java/awt/color/ICC_Profile/WriteProfileToFile.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.awt.color.ColorSpace; +import java.awt.color.ICC_Profile; +import java.io.File; +import java.io.FileOutputStream; +import java.io.OutputStream; +import java.nio.file.Files; +import java.util.Arrays; + +/** + * @test + * @bug 8261200 + * @summary Checks that we can write/read the icc profile to/from file + */ +public final class WriteProfileToFile { + + public static void main(String[] args) throws Exception { + byte[] gold = ICC_Profile.getInstance(ColorSpace.CS_sRGB).getData(); + + testViaDataArray(gold); + testViaFile(gold); + testViaStream(gold); + } + + private static void testViaDataArray(byte[] gold) { + ICC_Profile profile = ICC_Profile.getInstance(gold); + compare(gold, profile.getData()); + } + + private static void testViaFile(byte[] gold) throws Exception { + ICC_Profile profile = ICC_Profile.getInstance(gold); + profile.write("fileName.icc"); + try { + profile = ICC_Profile.getInstance("fileName.icc"); + compare(gold, profile.getData()); + } finally { + Files.delete(new File("fileName.icc").toPath()); + } + } + + private static void testViaStream(byte[] gold) throws Exception { + ICC_Profile profile = ICC_Profile.getInstance(gold); + File file = new File("fileName.icc"); + try (OutputStream outputStream = new FileOutputStream(file)) { + profile.write(outputStream); + profile = ICC_Profile.getInstance("fileName.icc"); + compare(gold, profile.getData()); + } finally { + Files.delete(file.toPath()); + } + } + + private static void compare(byte[] data1, byte[] data2) { + if (!Arrays.equals(data1, data2)) { + throw new RuntimeException("Data mismatch"); + } + } +}