Index: trunk/src/com/drew/imaging/jpeg/JpegMetadataReader.java
===================================================================
--- trunk/src/com/drew/imaging/jpeg/JpegMetadataReader.java	(revision 8132)
+++ trunk/src/com/drew/imaging/jpeg/JpegMetadataReader.java	(revision 8243)
@@ -35,4 +35,5 @@
 //import com.drew.metadata.adobe.AdobeJpegReader;
 import com.drew.metadata.exif.ExifReader;
+import com.drew.metadata.file.FileMetadataReader;
 //import com.drew.metadata.icc.IccReader;
 import com.drew.metadata.iptc.IptcReader;
@@ -79,13 +80,13 @@
     public static Metadata readMetadata(@NotNull File file, @Nullable Iterable<JpegSegmentMetadataReader> readers) throws JpegProcessingException, IOException
     {
-        InputStream inputStream = null;
-        try
-        {
-            inputStream = new FileInputStream(file);
-            return readMetadata(inputStream, readers);
+        InputStream inputStream = new FileInputStream(file);
+        Metadata metadata;
+        try {
+            metadata = readMetadata(inputStream, readers);
         } finally {
-            if (inputStream != null)
-                inputStream.close();
+            inputStream.close();
         }
+        new FileMetadataReader().read(file, metadata);
+        return metadata;
     }
 
@@ -123,9 +124,5 @@
         for (JpegSegmentMetadataReader reader : readers) {
             for (JpegSegmentType segmentType : reader.getSegmentTypes()) {
-                for (byte[] segmentBytes : segmentData.getSegments(segmentType)) {
-                    if (reader.canProcess(segmentBytes, segmentType)) {
-                        reader.extract(segmentBytes, metadata, segmentType);
-                    }
-                }
+                reader.readJpegSegments(segmentData.getSegments(segmentType), metadata, segmentType);
             }
         }
Index: trunk/src/com/drew/imaging/jpeg/JpegSegmentMetadataReader.java
===================================================================
--- trunk/src/com/drew/imaging/jpeg/JpegSegmentMetadataReader.java	(revision 8132)
+++ trunk/src/com/drew/imaging/jpeg/JpegSegmentMetadataReader.java	(revision 8243)
@@ -16,17 +16,11 @@
 
     /**
-     * Gets a value indicating whether the supplied byte data can be processed by this reader. This is not a guarantee
-     * that no errors will occur, but rather a best-effort indication of whether the parse is likely to succeed.
-     * Implementations are expected to check things such as the opening bytes, data length, etc.
-     */
-    public boolean canProcess(@NotNull final byte[] segmentBytes, @NotNull final JpegSegmentType segmentType);
-
-    /**
-     * Extracts metadata from a JPEG segment's byte array and merges it into the specified {@link Metadata} object.
+     * Extracts metadata from all instances of a particular JPEG segment type.
      *
-     * @param segmentBytes The byte array from which the metadata should be extracted.
+     * @param segments A sequence of byte arrays from which the metadata should be extracted. These are in the order
+     *                 encountered in the original file.
      * @param metadata The {@link Metadata} object into which extracted values should be merged.
      * @param segmentType The {@link JpegSegmentType} being read.
      */
-    public void extract(@NotNull final byte[] segmentBytes, @NotNull final Metadata metadata, @NotNull final JpegSegmentType segmentType);
+    public void readJpegSegments(@NotNull final Iterable<byte[]> segments, @NotNull final Metadata metadata, @NotNull final JpegSegmentType segmentType);
 }
